5

現在の条項データベースに特定の条項 (事実または規則として) が存在するかどうかを確認する必要がある大学の課題に取り組んでいます。

アイデアは、ヘッダーが verify(+name, +arguments) であるルールを使用することです。データベースに name(arguments) をヘッドとする別のルールが存在する場合、このルールは true になります。

どんな助けでも大歓迎です...

4

2 に答える 2

6

実際にゴールを呼び出すため、使用call/1はお勧めできませんが、事実/ルールが存在するかどうかを確認したいだけで、呼び出しがトリガーされる可能性のある長い計算の後に待ちたくありません。呼び出されたルールが順番に呼び出す場合に、画面に何かを出力します。さらに、呼び出しが失敗した場合でも成功する必要があります (ただし、事実/ルールはそれ以外の場合にあります)。call/1writeln/1verify/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.

ここに の 2 つのバージョンがありますverify/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.
于 2008-12-03T21:07:42.037 に答える
1

統一の概念をご存知ですか?あなたがしなければならないことは、見つけようとしているもののように見える述語を呼び出すだけです.

したがって、データベースで次のようになります。

father(abraham,isaac).

次に、次のようなものを呼び出します。

verify(father,[abraham,isaac]).

次に、述語本体に呼び出しのメカニズムを含める必要がfather(abraham,isaac).あります。呼び出しのメカニズムは、true.呼び出しfather(abraham,adam)が失敗する必要があります。

=../2これには、 との 2 つの述語が必要ですcall/2。SWI-Prolog を使用している場合は、インタープリターのコマンド ラインからhelp(=..).andを呼び出して、ドキュメントにアクセスします。help(call)

あなたの任務を台無しにしていないことを願っています。部分的にインスタンス化された述語をどうするかをまだ見つけなければなりません (したがって、自分で何か言いverify(father,[abraham,X]).ますが、ここからは難しいことではありません。

幸運を。

于 2008-11-26T21:03:23.263 に答える