用于返回prolog中给定列表中元素顺序排列的谓词
我试图弄清楚Prolog中的这个谓词是如何产生排列的,但我无法弄清楚sel的第二个谓词——我想知道其他人是否清楚这一点用于返回prolog中给定列表中元素顺序排列的谓词,prolog,Prolog,我试图弄清楚Prolog中的这个谓词是如何产生排列的,但我无法弄清楚sel的第二个谓词——我想知道其他人是否清楚这一点 % permutation(L1, L2): L2 is a permutation of L1 permutation([], []). permutation(L1, [X|Y]):- sel(L1, X, T), permutation(T, Y). sel([X|Y], X, Y). sel([X|Y], Z, [X
% permutation(L1, L2): L2 is a permutation of L1
permutation([], []).
permutation(L1, [X|Y]):-
sel(L1, X, T),
permutation(T, Y).
sel([X|Y], X, Y).
sel([X|Y], Z, [X|T]):-
sel(Y, Z, T).
sel/3
只需找到列表拆分头和列表其余部分的排列。如果你叫它,你会得到:
?- sel([1,2,3],A,B).
A = 1,
B = [2, 3]
A = 2,
B = [1, 3]
A = 3,
B = [1, 2]
false
请注意,在prolog中,谓词是按顺序测试的,因此如果您运行
sel([X|Y], X, Y).
sel([X|Y], Z, [X|T]):-
sel(Y, Z, T).
solve(L,LO):-
findall([A,B],sel(L,A,B),LO).
你得到
L = [[1, [2, 3]], [2, [1, 3]], [3, [1, 2]]]
L = [[3, [1, 2]], [2, [1, 3]], [1, [2, 3]]]
但是如果你像这样交换两个谓词
sel([X|Y], Z, [X|T]):-
sel(Y, Z, T).
sel([X|Y], X, Y).
solve(L,LO):-
findall([A,B],sel(L,A,B),LO).
你得到
L = [[1, [2, 3]], [2, [1, 3]], [3, [1, 2]]]
L = [[3, [1, 2]], [2, [1, 3]], [1, [2, 3]]]
这显然会改变结果