2

これは単純な問題かもしれませんが、別の方法で行う必要があります。問題は、プロローグで飛行機の可能なルートを見つけなければならないことです。私はこのナレッジベースを持っています

from_to(fresno,seattle).
from_to(fresno,albany).          
from_to(albany,dallas).     
from_to(fresno,boston). 
from_to(dallas,seattle).         
from_to(dallas,albany).
from_to(seattle,dallas).           
from_to(seattle,omaha).         
from_to(atlanta,albany).
from_to(atlanta,dallas).
from_to(atlanta,boston).
from_to(omaha,atlanta).         
from_to(omaha,albany).
from_to(albany,seattle).

そして、X から Y に移動できるかどうかをチェックする述語 route(X,Y) を作成する必要があります。

route(X,Y):-from_to(X,Y).
route(X,Y):-from_to(X,Z), route(Z,Y).

しかし、グラフは循環的であるため、機能しません。私はインターネットで検索しましたが、誰もがリストを使用して訪問したパスを確認することだけを言いました。しかし、私はリストを使用することはできません! リストを使用せずに述語ルート (X,Y) を作成する必要があります。リストを使用せずにこれを行うにはどうすればよいですか? ありがとうございました

4

4 に答える 4

1

SWI-Prolog を厳密に使用する必要がない場合は、テーブルをサポートする Prolog システムで簡単に使用できます。B-Prolog に追加:- table route/2.したところ、動作するようになりました:

?- route(fresno, omaha).
yes

?- route(fresno, fresno).
no

?- route(atlanta, atlanta).
yes

?- route(atlanta, X).
X = albany ?;
X = dallas ?;
X = boston ?;
X = seattle ?;
X = omaha ?;
X = atlanta
yes
于 2014-11-27T04:45:42.007 に答える
1
route(X0,X) :-
   from_to(X0,X1),
   closure0(from_to,X1,X).

の定義については、この質問を参照してくださいclosure0/3

于 2014-11-26T22:49:46.250 に答える
0

私は試してみます

:- dynamic visited/1.

route(X,Y) :- retractall(visited(_)), route_(X,Y).
route_(X,Y) :- from_to(X,Y).
route_(X,Y) :- from_to(X,Z), \+ visited(Z), asserta(visited(Z)), route_(Z,Y).

テスト:

1 ?- route(fresno, omaha).
true ;
false.

2 ?- route(fresno, omaha).
true ;
false.

3 ?- route(fresno, fresno).
false.

4 ?- route(atlanta, atlanta).
true ;
false.

グラフはソース コードで定義されているため、別の方法は次のようになります。

:- dynamic from_to/2.

route(X,Y):-retract(from_to(X,Y)).
route(X,Y):-retract(from_to(X,Z)), route(Z,Y).

ただし、最初の呼び出しの後、KB のリロードが必要です。

于 2014-11-26T23:50:53.347 に答える