如何写好谓词(not Between)
我编写代码如下
testb :-
X::1..10,
V1 = 3,
V2 = 6,
testbb(X,V1,V2),
writeln(X).
testbb(X,V1,V2) :-
(
count(I,V1,V2),param(X,V1,V2) do
X#\=I
).
?- testb.
Yes (0.00s cpu)
_385{[1, 2, 7 .. 10]}
它运行良好,但我认为它效率不高,
非常感谢:)
I write code follwing
testb :-
X::1..10,
V1 = 3,
V2 = 6,
testbb(X,V1,V2),
writeln(X).
testbb(X,V1,V2) :-
(
count(I,V1,V2),param(X,V1,V2) do
X#\=I
).
?- testb.
Yes (0.00s cpu)
_385{[1, 2, 7 .. 10]}
It works well, but i think it isn't efficient
Thanks very much :)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您可以通过以下方式将
X
的域限制在V1
到V2
的范围之外:替换您的
testbb/3
与not_ Between/3
。此定义确保X
无法准确地采用Lower
和Upper
值;如果您希望将范围约束包含在X
的域中,则可以使用范围约束#<
和#>
。这已经过测试并可与 SWI-Prolog 一起使用。要在 SWI-Prolog 文件中使用 CLP(FD),请确保在指令中导入源文件顶部的 CLP(FD) 库,如下所示:
You could confine the domain of
X
to lie outside the range withinV1
toV2
by:Replace your
testbb/3
withnot_between/3
. This definition ensures thatX
cannot take onLower
andUpper
values exactly; you could use the range constraints#<
and#>
instead if you wish them to be included in the domain forX
.This is tested and working with SWI-Prolog. To use CLP(FD) in a SWI-Prolog file, make sure you import the CLP(FD) library at the top of your source file in a directive, like this: