如何在prolog中实现对应函数
我是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,
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).