1

これまでに思いついた最高のものは、この関数です。

 numberFromList([X], X) :-  
    digit(X), !.  
 numberFromList(List, N) :-  
    member(X, List),     
    delete(List, X, LX),  
    numberFromList(LX, NX),  
    N is NX * 10 + X.

wheredigit/1は、アトムが 10 進数かどうかを検証する関数です。

は、のすべての数字numberFromList(List, N)で形成できるすべての数値を検索しますList
[2, 3] -> 23, 32。しかし、私はこの結果を得たい:[2, 3] -> 2, 3, 23, 32

私はこれについて考えるのに多くの時間を費やしましたappend(L, _, List).

貢献していただければ幸いです。

4

3 に答える 3

0

リストから数字をスキップすると、大文字と小文字が失われます。

 numberFromList([X], X) :-  
    digit(X), !.  
 numberFromList(List, N) :-
    member(X, List),     
    delete(List, X, LX),
    numberFromList(LX, NX),  
    ( % use X
        N is NX * 10 + X
    ; % skip X
        N = NX
    ).

ところで、@Roland Illigが述べたようにselect(X, List, LX)、置き換える必要がありますmember(X, List), delete(List, X, LX)

于 2010-05-27T04:27:28.970 に答える
0

atomic_list_concat/2atom_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/3numberFromList/2findall/3

于 2010-05-27T01:40:10.897 に答える
0

述語は、からのシンボルで構成されるunique/3長さ までのすべてのリストを生成します。生成されたリストは、一度に に保存されます。MaxLenSymbolsL

unique(MaxLen, Symbols, L) :-
    between(0, MaxLen, Len),
    length(L, Len),
    unique(Symbols, L).

リストを生成するためのヘルパー述語。

unique(_, []).
unique(Set, [H|R]) :-
    select(H, Set, ReducedSet),
    unique(ReducedSet, R).

上記の述語を示す簡単なプログラム:

main :-
    unique(5, [2,3], L),
    write(L), nl, fail.
于 2010-05-26T23:19:31.010 に答える