SWI Prolog检查不同列表中的两个元素是否不在同一位置。元件1应位于元件位置之前或之后
我需要编写一个谓词bapos(L1,L2,E1,E2),当L1和L2是列表时,该谓词为true,使得E1在L1中的位置在E2在L2中的位置之前或之后 我的解决方案: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([_|_],[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.