私は Prolog で書かれた小さなプログラムを持っています。現時点では、最初の結果を印刷できます
test(X, 1, 4, 5).
write(X).
しかし、X の結果が複数ある場合、次の結果を出力するにはどうすればよいでしょうか?
ありがとう。
障害駆動ループを使用します。
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)).
「;」を押し続けなくても、呼び出しで変数のすべての解を取得したい場合 次の解決策として、次のように findall 述語を使用できます。
findall(X,test(X,1,4,5),L).
最初の引数は、すべての値を収集する変数を指定します。2 番目の引数は、すべての解を見つけたい述語とその引数であり、3 番目の引数は X のすべての値のリストになります。すべてのソリューションから。
したがって、ここから、リストとしてフォーマットされた結果に満足している場合は、L の値を出力することができます。それ以外の場合は、Vincent Ramdhanie が指摘しているように、L の内容を希望どおりに出力するために、再帰的な述語を記述する必要があります。
自動的にということですか?; を使用してバックトラック コマンドを発行できます。バックトラックして次の値を取得します。ただし、プログラム内で複数の結果を出力したい場合は、再帰を使用します。あなたがやろうとしていることの詳細をいくつか教えてください。
更新: ; を発行することはできません。結果を「ループ」する手順を作成する必要があるため、結果をリストに入れたい場合があります。
printList([]) :- write("").
printList([H|T]) :- write(H), printList(T).