すべてが同じパターンに従ういくつかのルールが必要だとします。可能なすべての最初の引数を明示的にリストすることにより、非決定論的な動作を回避したいときに、この状況に遭遇しました。ただし、いくつかの可能性についてはまったく同じことを行う必要があることはわかっています。これに対処する 1 つの方法は、末尾にキャッチオール句を含めることです。
foo(a) :- /* do something */.
foo(b) :- /* do something else*/.
foo(_). /* ignore the rest */
しかし、これはあまり良いことではありません。なぜなら、予期しない入力があったのか、それとも自分のプログラムで間違いを犯したのかを実際に知ることができないからです。これを避けるために、私は言うこともできます
foo(X) :- memberchk(X, [ /* list of possible values of X */ ]).
しかし、繰り返しになりますが、私は現在、Prolog の決定論的な動作と、議論が根拠のあるインデックス作成と戦っています。
したがって、代わりに、次のようなことを行います。
term_expansion(foos(Foos), Foo_rules) :-
maplist(expand_foo, Foos, Foo_rules).
expand_foo(Foo, foo(Foo)).
other_foos([x,y,z]).
問題は、このような既存のコードを見つけようとしたのですが、できませんでした。私が何か間違ったことをしているからですか?この問題にアプローチするより良い方法はありますか? それとも完全に回避しますか?
「あなたは間違った問題を解決している」という答えは気にしません。
編集: いくつかのグーグルは、実際に SWI-Prolog ドキュメントからこの非常によく似た例に私を連れて行きました:
http://www.swi-prolog.org/pldoc/man?section=ext-dquotes-motivation (一番下)