?- permutation([A,B,C],Z).
Z = [A, B, C] ;
Z = [A, C, B] ;
Z = [B, A, C] ;
Z = [B, C, A] ;
Z = [C, A, B] ;
Z = [C, B, A] ;
false.
理にかなっています。の順列に取り組むことができ[A,B,C]、その順列には と同じ要素が含まれている[A,B,C]ため、これらの要素に対して行うことはすべて、元のリストに適用されます。
今:
?- findall(X, permutation([A,B,C], X), Z).
Z = [[_G1577, _G1580, _G1583], [_G1565, _G1568, _G1571], [_G1553, _G1556, _G1559], [_G1541, _G1544, _G1547], [_G1529, _G1532, _G1535], [_G1517, _G1520, _G1523]].
どうして??findall/3ではなく、完全に無関係な変数を含むリストが表示されるのはなぜA,B,Cですか? のリストはZ互いに関連していないため、実際に得られる結果は長さ 3 の 6 つのランダムなリストであり、これは私が照会したものとはまったく異なります。
この動作により、次のようなばかげた結果が得られます。
?- findall(X, permutation([A,B,C],X), Z), A = 1.
A = 1,
Z = [[_G1669, _G1672, _G1675], [_G1657, _G1660, _G1663], [_G1645, _G1648, _G1651], [_G1633, _G1636, _G1639], [_G1621, _G1624, _G1627], [_G1609, _G1612, _G1615]].
これは、論理的な観点からは意味がありません。
これが実際には関係型の純粋な論理述語ではないことは理解してfindall/3いますが、これがここに示されている動作をどのように正当化するのかわかりません。
したがって、私の質問は次のとおりです。
この動作が述語に選ばれたのはなぜですか?
この動作が実際に私が望むものよりも好ましい一般的な状況はありますか?
私が望む動作で のバージョンを実装する方法は
findall/3?