0

プロローグにこのナレッジベースがあります...

start :- navabi(C).
male(X,N) :-
   write('Is this a male? '), flush_output,
   read(yes).

navabi(N):- male(N) -> print('he is navabi') ; mirian(N).
mirian(N):- not( male(N)), print('she is ms.mirian').
female(X) :- not(male(X)).

問題は、このプログラムを開始して男性ではない人を入力すると、プログラムが mirian に移動することです。それから別のものを印刷すると、その人が男性かどうかを再度確認します (ただし、この「N」は男性ではないことに注意してください) が、「これは男性ですか?」と再度尋ねられます。プロローグは以前の知識を忘れているようです。誰でもこれで私を助けることができますか?

よろしく。

4

1 に答える 1

1

male/1 を呼び出しますが、(投稿したコードでは) male/2 しかありません。male/1 が動的として宣言されていない限り、これは通常例外につながります。この場合、male(N) は常に false になります。一部のプロローグのバリエーションでは、静的であっても常に false と見なされる可能性があると思います。どのバージョンのプロローグを使用していますか?

新しいデータをアサートするには、asserta/1 または assertz/1を使用します。お気づきのように、プロローグにはメモリがありません!

于 2011-12-11T20:39:43.043 に答える