首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >swi-prolog和yap的不同结果

swi-prolog和yap的不同结果
EN

Stack Overflow用户
提问于 2017-11-10 13:13:28
回答 1查看 249关注 0票数 7

示例程序枚举并计数8皇后解决方案的数量。(如果代码难以阅读,很抱歉;这是由S表达式生成的机器生成的。原代码为11.html)

规则:

代码语言:javascript
复制
[user].
(perm([X|Y],Z) :- (perm(Y,W),takeout(X,Z,W))).
perm([],[]).
takeout(X,[X|R],R).
(takeout(X,[F|R],[F|S]) :- (takeout(X,R,S))).
(solve(P) :- (perm([1,2,3,4,5,6,7,8],P),combine([1,2,3,4,5,6,7,8],P,S,D),alldiff(S),alldiff(D))).
(combine([X1|X],[Y1|Y],[S1|S],[D1|D]) :- (is(S1,+(X1,Y1)),is(D1,-(X1,Y1)),combine(X,Y,S,D))).
combine([],[],[],[]).
(alldiff([X|Y]) :- (\+ member(X,Y),alldiff(Y))).
alldiff([X]).
end_of_file.

查询:

代码语言:javascript
复制
(setof(P,solve(P),Set),length(Set,L),write(L),write('\n'),fail).

swipl返回92,而yap返回40320。另外,当我查询solve(P)时,swipl只返回两个解决方案(这也与92相矛盾);yap返回的更多(可能是其中的40320 )。那为什么会有区别呢?有这么严重的兼容性问题吗?

版本:

  • YAP 6.2.2 (x86_64-linux):2016年9月17日星期六:59:03
  • 版本7.2.3用于amd64
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-10 13:29:00

在较早版本的YAP中,对未定义谓词的查询根本失败。在上面的例子中,在YAP中没有定义的是member/2。由于这个原因,您的测试alldif/1总是成功的--因此您得到的是大量的测试。

这方面的行为由Prolog标志unknown控制,其默认值应该是error。在YAP6.2中,缺省值是(错误的) fail。这一点在6.3中得到了纠正。说

代码语言:javascript
复制
:- set_prolog_flag(unknown, error).

若要获得未定义谓词的干净错误,请执行以下操作。然后,您需要定义member/2

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47223608

复制
相关文章

相似问题

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