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

问题描述

我需要写一个谓词bapos(L1,L2,E1,E2),当L1和L2列出时,它为真,这样E1在L1中的位置就是位置E2在L2中的位置之前或之后的位置。

我的解决方案:

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

this works but not as expected.

expected output.

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

My output:

bapos([1,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|_],E2).
bapos([_|L1],[_|L2],E2):-
  bapos(L1,L2,E2).

前两个子句检查E1和E2是在另一个元素之前还是之后。第三个子句是递归步骤。

示例运行:

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

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