gpt4 book ai didi

prolog - CLP(FD) 和 diff/2 中的重复约束

转载 作者:行者123 更新时间:2023-12-04 17:32:15 26 4
gpt4 key购买 nike

在 SWI-Prolog 中,以下查询给出了这个结果:

?- X mod 2 #= 0, X mod 2 #= 0.
X mod 2#=0,
X mod 2#=0.

虽然正确,但显然不需要第二个约束

相似地:
?- dif(X,0), dif(X,0).
dif(X, 0),
dif(X, 0).

有没有办法避免这种重复的约束? (显然,最正确的方法是不编写导致这种情况的代码,但这并不总是那么容易)。

最佳答案

您可以避免发布多余的约束,或者使用 setof/3 删除它们。 - 类似的构造。两者都是非常具体的实现。 SICStus 提供了用于此目的的最佳界面。 YAP 或 SWI 等其他实现或多或少地复制了该接口(interface),省略了 some essential parts。 .一个 recent attempt克服SWI的不足被拒绝。
避免发布限制
在 SICStus 中,您可以使用 frozen/2以此目的:

| ?- dif(X,0), frozen(X,Goal).
Goal = prolog:dif(X,0),
prolog:dif(X,0) ? ;
no
| ?- X mod 2#=0, frozen(X, Goal).
Goal = clpfd:(X in inf..sup,X mod 2#=0),
X mod 2#=0,
X in inf..sup ? ;
no
否则, copy_term/3可能已经足够好了,前提是约束彼此之间没有太多的相互联系。
消除冗余约束
在这里,一组类似于 call_residue_vars/1 的构造和 copy_term/3 可能是最好的方法。同样,最初的实现是在 SICStus....

关于prolog - CLP(FD) 和 diff/2 中的重复约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39994779/

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