如何在prolog中对应功能

时间:2017-09-18 11:26:50

标签: prolog

我是Prolog的初学者,我想知道如何实现这个对应的功能。

correspond(E1, L1, E2, L2)
     

如果列表L1的值为E1L2   有E2。这必须适用于L1L2适当的任何模式   列表(即[]或尾部为正确列表的列表)。   例如:

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作为中间值来获取E1E2的值,但这些代码返回True或False。

1 个答案:

答案 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).

说明:

  • 如果E1是第一个列表的第一个元素,则E2应该是第二个列表的第一个元素。
  • 否则,我们尝试使用列表1和2的尾部进行相同的操作,然后递归迭代。

请注意:

correspond(l,[h,e,l,l,o],X,[1,2,3,4,5])包含解决方案X = 3X = 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