首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prolog - ASP 'not‘to Prolog negate

Prolog - ASP 'not‘to Prolog negate
EN

Stack Overflow用户
提问于 2016-08-24 00:10:43
回答 1查看 293关注 0票数 2

我在答案集编程(ASP)中有一个示例问题。当我尝试用Prolog编写等价的代码时,我总是被not阻塞。

下面是ASP代码:

代码语言:javascript
复制
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的工作方式不同,但我就是搞不明白。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-24 01:21:13

问题是,如果事实之间没有匹配,这将永远循环:road(X,Y) :- road(Y,X).

代码语言:javascript
复制
is road(X,Y)?
is road(Y,X)?
is road(X,Y)?
is road(Y,X)? 
.....

您可以替换谓词:

代码语言:javascript
复制
road(X,Y) :- road(Y,X).

使用

代码语言:javascript
复制
road(X,X).

并添加:

代码语言:javascript
复制
reachable(X,Y):-
     road(X,Y)
  ;  road(Y,X).

并修改:

代码语言:javascript
复制
route(X,Y) :- road(X,Y), \+ blocked(X,Y).

至:

代码语言:javascript
复制
route(X,Y) :- reachable(X,Y), \+ blocked(X,Y).
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39106092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档