Prolog - ASP 'not' 到 Prolog 取反
Prolog - ASP 'not' to Prolog negate
我在答案集编程 (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 的工作方式不同,但我就是想不通。
问题是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).
我在答案集编程 (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 的工作方式不同,但我就是想不通。
问题是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).