我是Prolog的初学者,我想知道如何实现这个对应的功能。
correspond(E1, L1, E2, L2)
如果列表
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。
答案 0 :(得分:3)
这是我尝试过的,至少对你的例子有用:
correspond(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).
说明:
请注意:
correspond(l,[h,e,l,l,o],X,[1,2,3,4,5])
包含解决方案X = 3
和X = 4
。
尝试correspond(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
如果 真的 想要在最后一个结果之后获得true
而不是false
,那么您可能需要预先添加谓词:
correspond(_,[],_,[]).
导致:
correspond(_,[],_,[]).
correspond(E1,[E1|_T1],E2,[E2|_T2]).
correspond(E1,[_H1|T1],E2,[_H2|T2]) :-
correspond(E1,T1,E2,T2).
这意味着当您使用空列表(例如列表大小相同时的最后一次迭代)尝试它时,它是true
。