0

プロローグに次のプログラムがあります。これは、一連の事実から新しい結論を推測する単純な質問応答システムです。それ:

  • 特徴を尋ねて動物を発見する ( を使用recognition)
  • ナレッジ ベース内の任意の動物の特性を記述します ( を使用description)

プログラムには 1 つのエラーがあります。それは、fact/2 が未定義であるということです。recognition(animal)このエラーは、が要求された場合にのみ発生します。descriptionコマンドは完全に機能します。

PS私はそれが本当に簡単な解決策を持っていることを知っていますが、それが何であるかを見つけることができません。

コード:

rule(1, animal, mammal, [c1]).
rule(2, animal, mammal, [c2]).
rule(3, animal, bird, [c3]).
rule(4, animal, bird, [c4, c5]).
rule(5, mammal, carnivore, [c6]).
rule(6, mammal, carnivore, [c7, c8, c9]).
rule(7, mammal, ungulate, [c10]).
rule(8, mammal, ungulate_toed, [c11]).
rule(9, carnivore, cheetah,[c12,c13]).
rule(10, carnivore, tiger, [c12,c14]).
rule(11, ungulate, giraffe, [c15, c16, c12,c13]).
rule(12, ungulate, zebra, [c17, c14]).
rule(13, bird, ostrich, [c18, c15, c16, c19]).
rule(14, bird, penguin,[c18, c20, c19]).
rule(15, bird, albatross, [c21]).

/* Recognition process : discover animal's name */

recognition(X):- rule(N, X, Y, Z),
discover(Z),
found(rule),
conclusion(X,Y,N),
recognition(Y),
retractall(fact(_,_)).

recognition(_):- retract(rule), write('Done.'),nl.

recognition(_):- write('Don"t know this animal.'),nl.

found(X):- X,!.
found(X):- assert(X).

/* Discovering process */
discover([]).
discover([X|Y]):- ask(X), discover(Y).

ask(X):- fact(X,Yes),!.
ask(X) :- fact(X, no),!, fail.
ask(c1):- write('has it hair?'), nl,!, complete(c1).
ask(c2):- write('does it give milk?'), nl,!, complete(c2).
ask(c3):- write('has it featherS?'), nl,!,complete(c3).
ask(c4):- write('does it fly?'), nl, !,complete(c4).
ask(c5):- write('does it lay eggs?'), nl, !, complete(c5).
ask(c6):- write('does it eat meat?'), nl, !, complete(c6).
ask(c7):- write('has it pointed teeth?'), nl, !, complete(c7).
ask(c8):- write('has it claws?'), nl, !, complete(c8).
ask(c9):- write('has it eyes pointing forward?'), nl,!, complete(c9).
ask(c10):- write('has it hoofs?'),nl, !, complete(c10).
ask(c11):- write('does it chew cud?'),nl,!, complete(c11).
ask(c12):- write('has it a tawny color?'),nl,!, complete(c12).
ask(c13):- write('has it dark spots?'),nl, !, complete(c13).
ask(c14):- write('has it black stripes?'), nl, !, complete(c14).
ask(c15):- write('has it long legs?'),nl,!, complete(c15).
ask(c16):- write('has it a long neck?'), nl, !, complete(c16).
ask(c17):- write('has it a white color?'), nl,!, complete(c17).
ask(c18):- write('does it not fly?'), nl, !, complete(c18).
ask(c19):- write('is it black and white?'),nl,!, complete(c19).
ask(c20):- write('does it swim?'),nl, !, complete(c20).
ask(c21):- write('is it a good flyer?'),nl,!, complete(c21).

complete(X):- read(Y), assert(fact(X,Y)), Y=yes.

/* Conclusion of the recognition process */
conclusion(X, Y, N):- nl, tab(4), write('--- the '), write(X),
write(' is a '), write(Y), write(' by rule '),
write(N), nl, nl.

/* Description process: discover animal's properties */
description(X):- rule(N, Y, X, Z), description1(Y,L,[]),
conclusion1(X, L, Y, Z, N).

description(_):- nl,write('Don''t know this animal.'),nl.
description1(Y, L, Ls):-rule(_, X, Y,_), description1(X, L, [X|Ls]) .
description1(_,L,L).

/* Conclusions of the description process */
conclusion1(X, L, Y, Z, N):- nl, write('a '),write(X),
write(' is an '),
output(L), write(Y),
write('satisfying conditions: '),nl,
output(Z), nl,write('by rule '),
write(N), write(' .') .

output([]).
output( [A|B] ) :- write(A), tab(1), output(B).

トレースは次のとおりです。

[trace] 1 ?- recognition(animal).
   Call: (6) recognition(animal) ? creep
   Call: (7) rule(_G2040, animal, _G2042, _G2043) ? creep
   Exit: (7) rule(1, animal, mammal, [c1]) ? creep
   Call: (7) discover([c1]) ? creep
   Call: (8) ask(c1) ? creep
   Call: (9) fact(c1, yes) ? creep
   Fail: (9) fact(c1, yes) ? creep
   Redo: (8) ask(c1) ? creep
   Call: (9) fact(c1, no) ? creep
   Fail: (9) fact(c1, no) ? creep
   Redo: (8) ask(c1) ? creep
   Call: (9) write('has it hair?') ? creep
has it hair?
   Exit: (9) write('has it hair?') ? creep
   Call: (9) nl ? creep

   Exit: (9) nl ? creep
   Call: (9) complete(c1) ? creep
   Call: (10) read(_G2043) ? creep
|: yes.
   Exit: (10) read(yes) ? creep
^  Call: (10) assert(fact(c1, yes)) ? creep
^  Exit: (10) assert(fact(c1, yes)) ? creep
   Call: (10) yes=yes ? creep
   Exit: (10) yes=yes ? creep
   Exit: (9) complete(c1) ? creep
   Exit: (8) ask(c1) ? creep
   Call: (8) discover([]) ? creep
   Exit: (8) discover([]) ? creep
   Exit: (7) discover([c1]) ? creep
   Call: (7) found(rule) ? creep
   Call: (8) rule ? creep
ERROR: found/1: Undefined procedure: rule/0
ERROR:   However, there are definitions for:
ERROR:         rule/4
   Exception: (8) rule ? 
4

1 に答える 1

0

ディレクティブを追加します

:- dynamic fact/2.
:- dynamic rule/4.

これらの目的は、プログラムの開発中に有用なメッセージ (まさにあなたが見たもの) を生成することです。

編集: デバッグしたばかり - シングルトンに変更retract(rule)retract(rule(_,_,_,_))て修正ask(X):- fact(X,Yes),!.- する必要がありますask(X):- fact(X,yes),!.。次に、クエリを実行すると

?- recognition(animal).

プロパティを要求するためにループを開始します。デバッグする場合は、gtrace または trace を使用します。

編集:トレースを読んで、上記の提案を変更する必要があると思います。する必要があります

:- dynamic fact/2.
:- dynamic rule/0.

そしてretract(rule(_,_,_,_))明らかに間違っています!正解はオリジナルでしたretract(rule)、ごめんなさい!

于 2013-06-16T13:21:32.360 に答える