我在答案集编程(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的工作方式不同,但我就是搞不明白。
发布于 2016-08-24 01:21:13
问题是,如果事实之间没有匹配,这将永远循环: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).https://stackoverflow.com/questions/39106092
复制相似问题