2013-02-16 48 views
1

我想要找出列表中的局部最大值。基本上我要找到的值大于列表之前的元素和其后的元素,结果应该是所有局部最大值的列表。prolog:列表中的局部最大值

例子: 所以查询local_maximum([3,2,3,4,5,2,7,3,6,5], Answer)应该回答Answer=[5,7,6](因为5>4 , 5>2... 7>2, 7>3等..)

我的逻辑是你继续做递归调用,直到你达到只有3列表中的元素。您检查中间元素是否大于左侧和右侧元素,并且是否将其添加到列表中。

此外,我的意图是,当我上传递归调用树时,我总是想检查递归调用树中的第二个元素是否大于其左侧和右侧的元素。

1,3,5,2,1 
| 
3,5,2,1 
| 
5,2,1 
BASE CASE 
checks if 2 is greater than 5, and 1.... append nothing... 
| 
3,5,2,1 
checks if 5 is greater than 3 and 2, append 5... 

等..

/*base case stop if it reaches 3 elements*/ 
local_maximum([X,Y,Z], Answer):- Y>X, Y>Z, Answer is Y. 
local_maximum([X,Y,Z], []):- Y<X, Y<Z. 

local_maximum([H|T], Answer):- 
local_maximum(T, Answer), append([], Answer, Answer). 

我不知道如何去对这个... 对不起我的英语。问候,


解决。

您可以检查,而您所访问的列表,并保存刚刚适合元素:

local_maximum([X,Y,Z|Xs], [Y|Ms]) :- 
Y>X, Y>Z, 
local_maximum([Z|Xs], Ms). 

然后添加跳跃和基本情况的规则。您编写跳过案例的方式将影响上述规则,因此需要在此处进行剪辑。这是因为Prolog会根据请求搜索替代方案!我认为增加的剪辑提高了'程序'的可读性。

+0

我很高兴你解决了你的问题。但是在这么说的时候,你已经消除了你的问题。我将恢复你的改变,以便它可以帮助别人。 – 2013-02-18 01:48:10

回答

2

你可以检查,而您所访问的列表,并保存刚刚适合元素:

local_maximum([X,Y,Z|Xs], [Y|Ms]) :- 
    Y>X, Y>Z, 
    local_maximum([Z|Xs], Ms). 

然后添加跳跃和基本情况的规则。您编写跳过案例的方式将影响上述规则,因此需要在此处进行剪辑。这是因为Prolog 根据要求搜索替代品!我认为增加的剪辑提高了'程序'的可读性。

我测试与切割的版本:

?- local_maximum([3,2,3,4,5,2,7,3,6,5], Answer). 
Answer = [5, 7, 6]. 

?- local_maximum([1,2,1,2,1], Answer). 
Answer = [2, 2]. 
+0

当你说'跳过'时,你的意思是if和else语句吗?我添加了以下内容。 local_maximum([Y | Xs],Ms); local_maximum([Y | Xs] ,[] | Ms))。 另外,我添加了几个基本案例...如果最终有3个元素,则为3;如果最后只有2个元素,则为1。当我追踪到这件事时发生了什么,它将整个列表作为一个元素处理......奇怪的... – GoldAK47 2013-02-16 08:46:01

+0

好的旧的Prolog通过其他规则编码替代品。尝试添加*另一个*规则处理跳过的情况,并保持不变(除了最终裁减),我显示的规则。 – CapelliC 2013-02-16 09:35:58

+0

这太神奇了。谢啦。我不能相信我在调试时过于复杂。 – GoldAK47 2013-02-16 10:05:34

0

我不知道以前的解决方案,但尝试这个问题我自己,这是我如何能够解决这个问题了。

local_maximum([X,Y,Z], [Y|Ms]):- 
    nonvar(X), nonvar(Y), nonvar(Z), 
    Y>X, Y>Z, !. 

local_maximum([X,Y,Z|Xs], [Y|Ms]):- 
    nonvar(X), nonvar(Y), nonvar(Z), 
    Y>X, Y>Z, 
    local_maximum([X,Z|Xs], Ms). 

local_maximum([X,Y,Z|Xs], Ms):- 
    nonvar(X), nonvar(Y), nonvar(Z), 
    local_maximum([X,Z|Xs], Ms), !. 

所以通过测试你会得到。

| ?- local_maximum([3,2,3,4,5,2,7,3,6,5], Y). 
Y = [5,7,6|_] 
+0

您不需要'isInst/1'谓词。只需使用标准的'nonvar/1'内置谓词。 – 2015-02-22 19:05:47

+0

那么这是尴尬的感谢指出,我会进行更正。另外在任何人注意到这个问题的侧面说明你实际上并不需要实例化检查它只是当我一直遇到我的变量没有被实例化的问题,它抛弃了我的错误检查,所以我添加了这个谓词。 – Michael 2015-03-04 04:35:36