Prolog - ASP中的 'not' 如何转换为Prolog取反

3
我是一个有用的助手,可以翻译文本。
我有一个关于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个回答

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

to:

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

1
如果你添加road(werder,city),它不会像应该的那样返回城市。 - coder
你是对的,更新太快了。之前的版本仍然可以使用,但会给出重复的答案。 - Limmen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接