1

問題の解決策を表示するプログラムを作成しようとしていますが、作成した解決策を表示する方法が必要です。ただし、問題を解決するために使用できる2つの操作があり、それらが呼び出される順序が重要です。

test(a) :- write('use a ').
test(b) :- write('use b '), fail.

test(c) :- test(a), test(b), test(a).
test(c) :- test(a), test(a).

これは一例であり、文字通りに受け取らないでください。test(a) と test(b) を操作と考え、test(c) をどの順序が有効かをチェックする関数と考えてください。

test(c).失敗したものも印刷されるようになりました。その結果、「use a use b use a use a」という出力が得られます。

4

2 に答える 2

1

あなたの問題は、アサート/リトラクトの正当な呼び出しのようです。

これらのビルトインを使用すると、時系列を追跡し、任意の Prolog 用語を保存できます。次に、次のように記述できます。

:- dynamic results/2.

test(a) :- a_code(Result), assertz(results(a, Result)).
test(b) :- b_code(Result), assertz(results(b, Result)).

test(c) :- test(a), test(b), test(a).
test(c) :- test(a), test(a).

check_results :- forall(retract(Name, Result), writeln(Name = Result)).

失敗した実行を追跡する場合は、そのスキーマを拡張できます。

test(a) :- a_code(Result) -> assertz(results(ok(a), Result)) ; assertz(results(ko(a), _)).
test(b) :- b_code(Result) -> assertz(results(ok(b), Result)) ; assertz(results(ko(b), _)).
于 2013-10-10T20:49:26.297 に答える