gpt4 book ai didi

Prolog - ASP 'not' 到 Prolog 否定

转载 作者:行者123 更新时间:2023-12-05 05:22:59 25 4
gpt4 key购买 nike

我在答案集编程 (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).

关于Prolog - ASP 'not' 到 Prolog 否定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39106092/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com