在 Prolog 中检索给定区间内的所有数字

发布于 2024-12-09 02:35:29 字数 227 浏览 0 评论 0原文

我是 Prolog 世界的新手,我想编写一条返回特定范围内的所有元素的规则。

我打算做类似的事情

,例如:

foo(X, Low, High) :- X > Low, X < High.

当我输入 foo(X, 2, 5) 时,它应该返回 3,然后返回 4。

看来我的方法是错误的,我想知道哪种方法是正确的做吧。

I am new into the world of Prolog, and I would like to write a rule that return all the elements in a specific range.

I intend to do something like

Ex:

foo(X, Low, High) :- X > Low, X < High.

And when I type foo(X, 2, 5), it should return 3, and then 4.

It seems that my approach is wrong, and I would like to know which is the correct way to do it.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

醉生梦死 2024-12-16 02:35:29

当这样写时,Prolog 不知道你想要什么样的数字(以及你是否想要数字)。

实现这一点的一种方法是:

range(X, L, H) :- X is L + 1, X < H.
range(X, L, H) :- L1 is L + 1, L1 < H, range(X, L1, H).

When written like that, Prolog doesn't know what kind of numbers do you want (and whether you even want numbers).

One way to implement this would be:

range(X, L, H) :- X is L + 1, X < H.
range(X, L, H) :- L1 is L + 1, L1 < H, range(X, L1, H).
旧时光的容颜 2024-12-16 02:35:29

简单的答案:Between/3 :通过

?- between(3,4,X).
X = 3 ;
X = 4.

这种方式实现确切的行为有点微不足道。

您的方法不起作用的原因是 的定义:两个参数都应该实例化。所以,如果你想在不使用 Between/3 的情况下实现它,你应该像 svick 的建议那样做。

the easy answer: between/3:

?- between(3,4,X).
X = 3 ;
X = 4.

implementing the exact behaviour is kinda trivial this way.

the reason that your approach doesn't work is the definition of </2: both arguments should be instantiated. so, if you want to implement it without using between/3 you should do something like svick's suggestion.

流心雨 2024-12-16 02:35:29

使用 SWI-Prologlibrary(clpfd),可以这样写

:- use_module(library(clpfd)).

foo(X,Low,High) :-
    X #> Low,
    X #< High,
    label([X]).

Using SWI-Prolog and library(clpfd), you can write

:- use_module(library(clpfd)).

foo(X,Low,High) :-
    X #> Low,
    X #< High,
    label([X]).
挽容 2024-12-16 02:35:29

你也可以这样做(几乎是 Between/3 的重新实现:

range( X , Y , Z ) :-
  integer(X) ,
  integer(Y) ,
  range1(X,Y,Z)
  .

range1( X , X , X ) .              % X equals Y
range1( X , Y , X ) :- X < Y .
range1( X , Y , Z ) :- X < Y , X1 is X+1 , range( X1 , Y , Z ) .
range1( X , Y , X ) :- X > Y .
range1( X , Y , Z ) :- X > Y , X1 is X-1 , range( X1 , Y , Z ) .

You could also do this (pretty much a reimplementatio of between/3:

range( X , Y , Z ) :-
  integer(X) ,
  integer(Y) ,
  range1(X,Y,Z)
  .

range1( X , X , X ) .              % X equals Y
range1( X , Y , X ) :- X < Y .
range1( X , Y , Z ) :- X < Y , X1 is X+1 , range( X1 , Y , Z ) .
range1( X , Y , X ) :- X > Y .
range1( X , Y , Z ) :- X > Y , X1 is X-1 , range( X1 , Y , Z ) .
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文