2017-04-11 60 views
0

我一直在为Prolog工作几个星期。我现在试图在其中编写一个称为匹配的函数:Prolog - 比较同一索引上具有相同元素的列表

使用三个参数(所有列表)编写一个名为匹配的谓词。 第三个列表必须包含前两个列表中包含相同值的位置的索引 。

如果我运行

matching([10,71,83,9,24,5,2],[8,71,26,9],Positions). 

的结果是:

?- matching([10,71,83,9,24,5,2],[8,71,26,9],Positions). 
Positions = [] ; 
Positions = [] ; 
Positions = [_2420] ; 
Positions = [_2420] ; 
Positions = [_2420, _2432];... 

正确的答案将是位置势必[1,3]。我不知道我的代码有什么问题。任何暗示是赞赏。

+0

看到这个问题,这是同样的问题,我认为:http://stackoverflow.com/q/43313755/7473772 – 2017-04-11 07:34:15

回答

3

提示?您的matchingHelper每个子句都包含错误!


OK,多了一丝一点:

基本情况

序言应该给你一个关于此单变量的警告。 ListofIndex是一个变量,但它只在一个地方使用。基本上这意味着这绝对没有限制,因此可以是任何东西。

正确的做法是,如果任一输入列表为空,则输出也为空。

matchingHelper([],_,,[])。 matchingHelper(,[],_,[])。

平等的情况下

这一个你几乎有正确的,但你处理ListOfIndex的方式是倒退。您根据谓词参数构造一个NewListOfIndex,并在递归调用中使用它。问题是ListOfIndex实际上是输出!所以你应该根据递归调用的输出构建ListOfIndex

matchingHelper([X|Xs], [X|Ys], Index, [Index|ListofIndex]) :- 
    Index2 is Index + 1, 
    matchingHelper(Xs, Ys, Index2, ListofIndex). 

不平等的情况下

与这一个仅有2小的问题。首先是这个条款只适用于X和Y不同的情况。只使用不同的变量名不会强制执行此操作。因为有一个前面的子句处理了相等的情况,所以prolog发现的第一个结果是正确的,但由于这个原因,它将继续找到其他不正确的解决方案。

第二个问题是你不增加索引。如果您忽略第一个元素,则必须递增当前索引以反映当前位置。

matchingHelper([X|Xs], [Y|Ys], Index, ListofIndex) :- 
    X \= Y, 
    Index2 is Index + 1, 
    matchingHelper(Xs, Ys, Index2, ListofIndex). 

下面是一个运行示例:

?- matching([10,71,83,9,24,5,2],[8,71,26,9],Positions). 
Positions = [1, 3] 
false 
+0

感谢很多为这个深入的答案。对不起,我想不出任何问题,请仔细阅读,谢谢。是的,它确实给了我单身人士的警告。我也在几分钟之前就发现了基本案例的错误,但没有在这里编辑我的代码,哈哈。 –

+0

那些确实是我的问题,解决了它,谢谢。 –

相关问题