Prolog - ASP'不'对Prolog否定

时间:2016-08-23 16:10:43

标签: prolog logic-programming negate answer-set-programming

我在答案集编程(ASP)中遇到了一个示例问题。当我尝试在Prolog中创建等效代码时,我一直被not阻塞。

这是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的工作方式不同,但我无法理解。

1 个答案:

答案 0 :(得分:2)

问题是road(X,Y) :- road(Y,X).如果事实中没有匹配,这将永远递归:

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

您可以替换谓词:

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

road(X,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).