问题描述
我需要写一个谓词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.