2017-12-28 30 views
-1

Prologのこの述語がどのように順列を生成するように働いているのか分かりますが、私はselの2番目の述語を理解できません。これが誰にも明らかかどうか?プロローグ内の指定されたリストの要素の順序の順列を返すための述語

% 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). 

答えて

1

sel/3単にリストのリスト分割ヘッド、残りの順列を見つけます。あなたはあなたが得るそれを呼び出す場合:

?- sel([1,2,3],A,B). 
A = 1, 
B = [2, 3] 

A = 2, 
B = [1, 3] 

A = 3, 
B = [1, 2] 
false 

注意をあなたがこの

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]]] 

を取得しかし、あなたは交換した場合このような2つの述語

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 = [[3, [1, 2]], [2, [1, 3]], [1, [2, 3]]] 

と明らかに結果が変わります。

関連する問題