atomic_list_concat/2
、atom_number/2
およびに SWI-PROLOG ビルトインを使用する 1 つの方法を次に示しますselect/3
。まず、エントリ ポイントは、最初は空のアキュムレータを使用する実装を参照します。
numberFromList(L, N) :-
numberFromList(L, [], N).
述語numberFromList/3
は、リストから数字を (チェックしないで) 累積するか、累積しないかのいずれかで、選択ポイントを残します。
numberFromList([_|Cs], Acc, N) :-
numberFromList(Cs, Acc, N).
numberFromList([C|Cs], Acc, N) :-
numberFromList(Cs, [C|Acc], N).
の最後の句はnumberFromList/3
、蓄積された数字のリストを並べ替え、それらをアトムに連結し、必要に応じて数値に変換します。
numberFromList([], [C|Cs], N) :-
permute([C|Cs], PermutedAcc),
atomic_list_concat(PermutedAcc, AN),
atom_number(AN, N).
場合によってpermute/2
は (以下で手動で定義されているように) などの組み込みとして利用できる場合がありますpermutation/2
。を使用した手動定義は次のselect/3
とおりです。
permute([], []).
permute([E|Es], [E0|PL]) :-
select(E0, [E|Es], Rem),
permute(Rem, PL).
すべての結果のリストが必要で、それ自体をバックトラックしたくない場合は、( の最初の節にある空のアキュムレータを使用して)numberFromList/2
への呼び出しを呼び出しでラップできます。numberFromList/3
numberFromList/2
findall/3