如何在prolog中实现对应函数

如何在prolog中实现对应函数,prolog,Prolog,我是Prolog的初学者,我想知道如何实现这个函数 当列表L1的值为E1,L2 有E2。这必须在L1和L2适当的任何模式下工作 列表(即,[]或尾部为正确列表的列表)。 例如: correspond(e,[h,e,l,l,o],X,[1,2,3,4,5]) 应该只有解决方案X=2 以下是我现在已经尝试过的: correspond(E1, L1, E2, L2). correspond(E1,[Elt1|List1],E2,[Elt2|List2]) :- nth0(Index,

我是Prolog的初学者,我想知道如何实现这个函数

当列表
L1
的值为
E1
L2
E2
。这必须在
L1
L2
适当的任何模式下工作 列表(即,
[]
或尾部为正确列表的列表)。 例如:

correspond(e,[h,e,l,l,o],X,[1,2,3,4,5])
应该只有解决方案
X=2

以下是我现在已经尝试过的:

 correspond(E1, L1, E2, L2).
 correspond(E1,[Elt1|List1],E2,[Elt2|List2]) :-
     nth0(Index, [Elt1|List1], E1).
     nth0(Index, [Elt2|List2], E2). 

我想使用
Index
作为中间值来获取
E1
E2
的值,但这些代码返回True或False

这是我尝试过的,至少对您的示例有效:

对应(e[h,e,l,l,o],X[1,2,3,4,5])
有解决方案
X=2

代码:

correspond(E1,[E1|_T1],E2,[E2|_T2]).
correspond(E1,[_H1|T1],E2,[_H2|T2]) :-
    correspond(E1,T1,E2,T2).
说明:

  • 如果E1是第一个列表的第一个元素,那么E2应该是第二个列表的第一个元素
  • 否则,我们对列表1和2的尾部进行同样的尝试,并递归地迭代
请注意:

对应(l[h,e,l,l,o],X[1,2,3,4,5])
有两种解决方案
X=3
X=4

尝试
对应(X[h,e,l,l,o],Y[1,2,3,4,5]
,您将得到:

  • X=h,Y=1
  • X=e,Y=2
  • X=l,Y=3
  • X=l,Y=4
  • X=o,Y=5
  • false

编辑: 如果真的希望在最后一个结果之后得到
真的
而不是
假的
,则可能需要在谓词前面加上前缀:

correspond(_,[],_,[]).
导致:

correspond(_,[],_,[]).
correspond(E1,[E1|_T1],E2,[E2|_T2]).
correspond(E1,[_H1|T1],E2,[_H2|T2]) :-
    correspond(E1,T1,E2,T2).

这意味着,当您尝试使用空列表时(例如,当列表大小相同时的最后一次迭代),它是
true

我尝试在swi prolog中简单地运行此命令,它似乎返回了正确的答案。“nth0(Index,[h,e,l,l,o],e),nth0(Index,[1,2,3,4,5],E2)。”您的第三行以点(
),使第四行成为新的事实。我想第三行应该以逗号(
)结尾?非常感谢。但当我试图获得更多结果时,结果却以“假”告终。有什么方法可以避免这种“假”吗?@YQ-YD大多数具有多个解决方案的谓词都会这样做。这只是意味着在路径上还有一个选择点,Prolog必须进行调查,但没有去任何地方。通常,摆脱它们会带来更多的麻烦。这就是其中的一种情况,因为Prolog在返回以获得另一个结果之前不会意识到它在列表项之外。@YQ-YD进行了编辑,因此当列表大小相同时,它以“true”而不是“false”结束。我更喜欢没有附加规则的解决方案。附加规则说“如果列表为空,则任何内容都对应于任何内容。”这对我来说并不真实,因为在其他情况下,E1和E2相互对应,因为它们在列表中处于同一位置。
甚至不在列表中,列表是空的。这大大混淆了意图。有时正确的做法是不统一。@DanielLyons是的,但是怎么做呢您理解“这必须在L1和L2都是正确列表的任何模式下工作(即,
[]
..”?无论如何,这只是试图回答OP对此答案的评论的一种变通方法:)
correspond(_,[],_,[]).
correspond(E1,[E1|_T1],E2,[E2|_T2]).
correspond(E1,[_H1|T1],E2,[_H2|T2]) :-
    correspond(E1,T1,E2,T2).