2016-08-23 10 views
2

Answer Set Programming(ASP)のサンプル問題があります。私がPrologで同等のコードを作成しようとすると、私はnotがブロックされたままになってしまいます。Prolog - ASP 'not' to Prolog negate

これはASPコードです:

road(berlin,potsdam). 
road(potsdam,werder). 
road(werder,brandenburg). 
road(X,Y) :- road(Y,X). 

blocked(werder,brandenburg). 

route(X,Y) :- road(X,Y), not blocked(X,Y). 
route(X,Y) :- route(X,Z), route(Z,Y). 

drive(X) :- route(berlin,X). 

#show drive/1 

答えは:drive(potsdam)drive(werder)drive(berlin)

Prologでは、最初はnot\+に変更するだけで簡単だと思っていました。私がdrive(X).を照会すると、それは再帰的にX = potsdam答えを生成します。私はPrologとASPが異なって動作することを知っていますが、私はそれを理解できません。

road(X,X). 

として

road(X,Y) :- road(Y,X). 

:あなたは述語を置き換えることができます

is road(X,Y)? 
is road(Y,X)? 
is road(X,Y)? 
is road(Y,X)? 
..... 

答えて

2

問題は事実の間で一致しない場合、これは永遠に再帰ますroad(X,Y) :- road(Y,X).です追加:

reachable(X,Y):- 
    road(X,Y) 
    ; road(Y,X). 

と変更:

route(X,Y) :- road(X,Y), \+ blocked(X,Y). 

へ:

route(X,Y) :- reachable(X,Y), \+ blocked(X,Y). 
+1

あなたは、道路(ヴェルダー、都市)を追加した場合。それは結果都市として、それはすべきではありません。 – coder

+0

あなたの権利は、更新を迅速にすることでした。以前のバージョンはまだ動作しますが、重複した回答が得られます。 – Limmen