gpt4 book ai didi

prolog - swi-prolog 和 yap 的不同结果

转载 作者:行者123 更新时间:2023-12-04 11:47:33 25 4
gpt4 key购买 nike

示例程序枚举并计算 8 皇后解的数量。 (对不起,如果代码难以阅读;这是从 S 表达式机器生成的。原始代码是 https://www.cpp.edu/~jrfisher/www/prolog_tutorial/2_11.html )

规则:

[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.

询问:
(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 日星期六 13:59:03 UTC
  • 适用于 amd64 的 SWI-Prolog 7.2.3 版
  • 最佳答案

    在旧版本的 YAP 中,对未定义谓词的查询完全失败。在上述情况下,它是 member/2这在 YAP 中没有定义。出于这个原因,您的测试 alldif/1总是成功 - 因此你得到的数字很大。

    此行为由 Prolog 标志 unknown 控制。其默认值应为 error .在 YAP 6.2 中,默认值是(错误地)fail .这在 6.3 中得到了纠正。说

    :- set_prolog_flag(unknown, error).

    为未定义的谓词获得一个干净的错误。然后,您需要定义 member/2 .

    关于prolog - swi-prolog 和 yap 的不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47223608/

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