SWI Prolog检查不同列表中的两个元素是否不在同一位置。元件1应位于元件位置之前或之后

SWI Prolog检查不同列表中的两个元素是否不在同一位置。元件1应位于元件位置之前或之后,prolog,predicate,Prolog,Predicate,我需要编写一个谓词bapos(L1,L2,E1,E2),当L1和L2是列表时,该谓词为true,使得E1在L1中的位置在E2在L2中的位置之前或之后 我的解决方案: bapos([_|_],[L2|_], _, L2). bapos([_|L1],[_|L2],E1,E2) :- bapos(L1,L2,E1,E2). ``` this works but not as expected. expected output. bapos([1,2,3], L2, 2, b). L2 = [b

我需要编写一个谓词bapos(L1,L2,E1,E2),当L1和L2是列表时,该谓词为true,使得E1在L1中的位置在E2在L2中的位置之前或之后

我的解决方案:

bapos([_|_],[L2|_], _, L2).
bapos([_|L1],[_|L2],E1,E2) :- bapos(L1,L2,E1,E2). ```

this works but not as expected.

expected output.

bapos([1,2,3], L2, 2, b).
L2 = [b|_G1869] ;
L2 = [_G1868, _G1871, b|_G1875] ;
false.

My output:

bapos([1,2,3],L2,2,b).
L2 = [b|_34474] ;
L2 = [_35132, _35138|_35140] ;
L2 = [_35132, b|_35800] ;
L2 = [_35132, _36458, b|_36466] ;
false.



我想我明白了你的意思,但表达方式不对。 这应该起作用:

bapos([E1|_], [_,E2|_], E1, E2).
bapos([_,E1|_], [E2|_], E1, E2).
bapos([_|L1], [_|L2], E1, E2):-
  bapos(L1, L2, E1, E2).
前两个子句检查E1和E2是在另一个元素之前还是之后。第三个子句是递归步骤

运行示例:

?- bapos([1,2,3],L2,2,b).
L2 = [b|_1542] ;
L2 = [_1540, _1546, b|_1554] ;
false.

?- bapos([1,2,3],[a,b,c],1,a).
false.