SWI Prolog检查不同列表中的两个元素是否位于同一位置

SWI Prolog检查不同列表中的两个元素是否位于同一位置,prolog,Prolog,我得到一个赋值,我需要写一个谓词“相同的位置(L1,L2,E1,E2)”,其中L1和L2是列表,E1是L1中的元素,E2是L2中的元素。当E1和E2在其列表中处于相同位置时,谓词为true。 我需要使用递归来解决这个问题 这是我对问题的解决方案: same_position([L1|_],[L2|_],E1,E2) :- L1==E1,L2==E2. same_position([_|L1],[_|L2],E1,E2) :- same_position(L1,L2,E1,E2). 这是可行的,

我得到一个赋值,我需要写一个谓词“相同的位置(L1,L2,E1,E2)”,其中L1和L2是列表,E1是L1中的元素,E2是L2中的元素。当E1和E2在其列表中处于相同位置时,谓词为true。 我需要使用递归来解决这个问题

这是我对问题的解决方案:

same_position([L1|_],[L2|_],E1,E2) :- L1==E1,L2==E2.
same_position([_|L1],[_|L2],E1,E2) :- same_position(L1,L2,E1,E2).
这是可行的,但并不完全如预期的那样,在分配的同时,出现了一个示例输出,其中下面的部分是问题所在。预期输出在打印false之前给出L的值,而mine solution仅打印false。我做错了什么

预期产出:

?- same_position(L, [a,a,c], 3, a).
L = [3|_G1667] ;
L = [_G1769, 3|_G1772] ;
false.
矿山产量:

?- same_position(L,[a,a,c],3,a).
false.
罪魁祸首是:

same_position([L1|_],[L2|_],E1,E2) :- L1==E1, L2==E2.
same_position([_|L1],[_|L2],E1,E2) :- same_position(L1,L2,E1,E2).
然而,在Prolog中,我们也可以在head中通过在head中使用相同变量两次(或更多次)来进行优化:

same_position([L1|_],[L2|_], L1, L2).
same_position([_|L1],[_|L2],E1,E2) :- same_position(L1,L2,E1,E2).
相同的位置([L1 | |,[L2 | |,L1,L2)。

相同的位置([[uuui124; L1]、[uui124; L2]、E1、E2):-相同的位置(L1、L2、E1、E2)。
可能首先定义谓词来解决具有一个元素的列表的问题,然后定义具有两个元素的列表的问题,然后将其一般化。
same_position([L1|_],[L2|_], L1, L2).
same_position([_|L1],[_|L2],E1,E2) :- same_position(L1,L2,E1,E2).