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

SWI-Prolog check if two elements in different lists are not at a same position. element 1 should be before or after element position

我需要编写一个谓词 bapos(L1,L2,E1,E2),当 L1 和 L2 是列表时,该谓词为真,使得 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.