5

私は Prolog で書かれた小さなプログラムを持っています。現時点では、最初の結果を印刷できます

test(X, 1, 4, 5).
write(X).

しかし、X の結果が複数ある場合、次の結果を出力するにはどうすればよいでしょうか?

ありがとう。

4

3 に答える 3

7

障害駆動ループを使用します。

test(X, 1, 4, 5), writeln(X), fail ; true.

または、次を使用して、より読みやすい方法で同じことを行いforall/2ます。

forall(test(X, 1, 4, 5), writeln(X)).

すべての解決策のリストを作成する必要はありません (これがfindall/3目的です)。ただし、単に印刷する以外の目的でこのリストが必要な場合を除きます。

Prolog にない場合forall/2は、次の方法で自分で実装します。

forall(A, B) :-
    \+ (call(A), \+ call(B)).
于 2009-11-08T16:16:08.917 に答える
3

「;」を押し続けなくても、呼び出しで変数のすべての解を取得したい場合 次の解決策として、次のように findall 述語を使用できます。

findall(X,test(X,1,4,5),L).

最初の引数は、すべての値を収集する変数を指定します。2 番目の引数は、すべての解を見つけたい述語とその引数であり、3 番目の引数は X のすべての値のリストになります。すべてのソリューションから。

したがって、ここから、リストとしてフォーマットされた結果に満足している場合は、L の値を出力することができます。それ以外の場合は、Vincent Ramdhanie が指摘しているように、L の内容を希望どおりに出力するために、再帰的な述語を記述する必要があります。

于 2009-11-08T15:21:20.277 に答える
2

自動的にということですか?; を使用してバックトラック コマンドを発行できます。バックトラックして次の値を取得します。ただし、プログラム内で複数の結果を出力したい場合は、再帰を使用します。あなたがやろうとしていることの詳細をいくつか教えてください。

更新: ; を発行することはできません。結果を「ループ」する手順を作成する必要があるため、結果をリストに入れたい場合があります。

   printList([]) :- write("").
   printList([H|T]) :- write(H), printList(T).
于 2009-11-08T15:00:25.560 に答える