質問
大学の課題に取り組んでおり、現在の条項データベースに特定の条項が(事実または規則として)存在するかどうかを確認する必要があります。
アイデアは、ヘッドがverify(+ name、+ arguments)であるルールを使用することです。このルールは、データベースにヘッドがname(arguments)である別のルールが存在する場合に当てはまります
ご協力いただければ幸いです...
解決
call / 1
を使用することは、 call / 1
が実際に目標を呼び出すため、良いアイデアではありませんが、ファクト/ルール が存在し、呼び出しがトリガーする可能性がある長い計算の後に待機したくない、および呼び出されたルールが順番に呼び出す場合、画面に何かを印刷したくない writeln / 1
。さらに、呼び出しが失敗した場合でも verify / 2
を成功させたいと思います(ただし、それ以外の場合はファクト/ルールが存在します)。
ソリューションとして、SWI-Prologは callable / 1
callable(+Term)
True if Term is bound to an atom or a compound term,
so it can be handed without type-error to call/1, functor/3 and =../2.
verify / 2
の2つのバージョンがあります。1つは call / 1
を使用し、もう1つは callable / 1
を使用します。
verify1(Name, Arguments) :-
Term =.. [Name | Arguments],
call(Term).
verify2(Name, Arguments) :-
Term =.. [Name | Arguments],
callable(Term).
father(abraham, isaac) :-
writeln('hello').
father(abraham, adam) :-
fail.
他のヒント
統一の概念に精通していますか?あなたがしなければならないことは、あなたが見つけようとしているもののように見える述語を呼び出すだけです。
だから、あなたのデータベースにあると言う:
father(abraham,isaac).
次のように呼び出します:
verify(father,[abraham,isaac]).
述語本体には、 father(abraham、isaac)を呼び出すメカニズムを含める必要があります。
は、 true。
を呼び出す必要があります。 father(abraham、 adam)
は失敗するはずです。
これには、 = .. / 2
と call / 2
の2つの述語が必要です。 SWI-Prologを使用している場合は、インタープリターのコマンドラインから help(= ..)。
および help(call)
を呼び出して、ドキュメントにアクセスします。
私はあなたのために割り当てを台無しにしないことを望みます。部分的にインスタンス化された述語をどう処理するかをまだ確認する必要があります(したがって、 verify(father、[abraham、X])。
のようなものを自分で言う必要がありますが、ここから難しいことではありません。
がんばって。