3

次のようなプロローグ ナレッジ ベースがあるとします。

guilty(X) :-
    commits(X,Y),
    crime(Y).
crime(murder).
crime(theft)

この質問をすると:

?- guilty(john)

Prolog に次のような質問をしてもらいたい:

is commits(john, murder) ?

そして、私はノーと答えます

is commits(john, theft) ?

はいと答えると、プロローグは言う

**yes**

どうすればこのようなものを作ることができますか?

ありがとう..

4

3 に答える 3

4

未知の事実に遭遇したときにユーザーに問い合わせる、変更された証明エンジンが必要です。

メタインタープリター Prolog の場合は Google です。この議論に興味がある場合は、最初のリンクから Markus Triska によるA Couple of Meta-interpreters in Prologという貴重なページを参照してください。ここで詳細を確認できます。

あなたの質問については、ルールで十分です

commits(Person, Crime) :-
    crime(Crime),
    format('is ~w ?', [commits(Person, Crime)]),
    read(yes).

テスト:

?- guilty(john).
is commits(john,murder) ?no.
is commits(john,theft) ?yes.
true.

read/1 は、入力を終了するためにドットを必要とすることに注意してください。

于 2012-07-15T19:20:23.607 に答える
1

ちょっとした推論用に「インタラクティブシェル」が必要です。ビルドは難しくありませんが、stackoverflow の質問の範囲を超えています。このチュートリアルでは、2 番目または 3 番目のレッスンで 1 つを作成し、通常、この質問に答えます。ユーザーが「作業用ストレージ」と答えるような事実を呼び出します。

http://www.amzi.com/ExpertSystemsInProlog/

于 2012-11-08T00:04:25.870 に答える
0

Prolog は左から右に物事を「実行」します。試す:

guilty(X) :-
    crime(Y),
    commits(X,Y).
crime(murder).
crime(theft)

したがって、有罪 (X) は、コミット (X、殺人) および/またはコミット (X、盗難) に依存します。

于 2012-07-14T20:07:30.927 に答える