2016-08-23 40 views
2

我有一個應答集編程(ASP)的例子問題。當我嘗試在Prolog中創建相應的代碼時,我一直在阻止not序言 - ASP'不'序言否定

這是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的工作方式不同,但我無法弄清楚。

回答

2

的問題是road(X,Y) :- road(Y,X).,這將永遠遞歸如果有事實之間不匹配:用

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)? 
..... 

您可以替換謂詞加:

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