1

最近、 http: //www.amzi.com/ExpertSystemsInPrologから無料で入手できる「BuildingExpertSystemsinProlog」という本を試しました。

付録には、鳥の識別データベースとともにネイティブシェルと呼ばれるコードがあります。問題は、シェルと相談して実行した後、次のことです。

主要。

ロード。

解決する。

「nostrils:external_tubular?」と尋ねます。

「いいえ」と答えると、スタックオーバーフローが発生します。問題はおそらくセクションブローにあります:

prove(true,_) :- !.
prove((Goal,Rest),Hist) :-
    prov(Goal,[Goal|Hist]),
    prove(Rest,Hist).
prove(Goal,Hist) :-
    prov(Goal,[Goal|Hist]).

prov(true,_) :- !.
prov(menuask(X,Y,Z),Hist) :- menuask(X,Y,Z,Hist), !.
prov(ask(X,Y),Hist) :- ask(X,Y,Hist), !.
prov(Goal,Hist) :-
    clause(Goal,Body),
    prove(Body,Hist).

誰か助けてくれませんか?どんな助けでも大歓迎です。

シェルの完全なコード:http://www.amzi.com/ExpertSystemsInProlog/code/native/native.pro

データベースの完全なコード:http://www.amzi.com/ExpertSystemsInProlog/code/native/birds.nkb

私はswiプロローグを使用しています。

4

3 に答える 3

1

問題は確かに

prove(Goal,Hist) :-
    prov(Goal,[Goal|Hist]).

prov(Goal,Hist) :-
    clause(Goal,Body),
    prove(Body,Hist).

clause(:Head, ?Body)節の先頭および対応する節の本体Headと統合できる場合は、trueである必要があります。Body残念ながら、どのプログラムでもSWI-Prologはclause(call(X), call(X))真実であると信じています。これは、それclause(call(nostrils(external_tubular)), X)が成功し、prove呼び出されていることを意味しprovます。

は静的述語であるため、その内容をまたはclause/2で変更することはできません。考えられる解決策は次のとおりです。retractallabolish

  1. SWI開発者にバグを報告する
  2. の句をbirds.nkb次のようなものに置き換え、シェルの実装でmyclause参照します。myclause
  3. 他のいくつかのProlog方言を見てください...
于 2012-05-27T20:45:26.850 に答える
1

私はここに問題があることを発見しました:

prove((Goal,Rest),Hist) :-
    prov(Goal,[Goal|Hist]),
    prove(Rest,Hist).
prove(Goal,Hist) :-
    prov(Goal,[Goal|Hist]).

swi-prologを使用すると、ヘッド((x、y、z)、[h])が2番目のprove述語と一致するため、推論プロセスでprove(Goal、Hist)がトリガーされ、無限ループが発生します。トレースを分析するのに8時間かかりました。

したがって、この問題を修正するには、prove((Goal、Rest)、Hist)の先頭にカットを配置する必要があります。コードは次のようになります。

prove((Goal,Rest),Hist) :-
    !,
    prov(Goal,[Goal|Hist]),
    prove(Rest,Hist).
prove(Goal,Hist) :-
    prov(Goal,[Goal|Hist]).
于 2012-05-28T05:49:14.667 に答える
0

prov((_,_),_) :- !, fail.セクションのすぐ上に述語を追加して修正することもできます。

prov(true,_) :- !.
prov(menuask(X,Y,Z),Hist) :- menuask(X,Y,Z,Hist), !.
prov(ask(X,Y),Hist) :- ask(X,Y,Hist), !.
prov(Goal,Hist) :-
    clause(Goal,Body),
    prove(Body,Hist).
于 2012-06-05T14:45:19.520 に答える