简单的Prolog程序 - 一个范围内或外的值?

时间:2013-02-25 13:58:47

标签: prolog

我正在尝试编写一个带有3个整数I,J和K的程序,如果K在I和J的范围内则返回true,如果它超出范围则返回false。

逻辑当然非常简单,但我不太了解Prolog的语法,足以实现它。

我将如何解决此任务。这是我目前得到的代码:

i(10).
j(20).
k(21).

inRange(i, j, k):-
   (k > i, k < j).

2 个答案:

答案 0 :(得分:3)

Prolog语法的第一条规则需要记住的是,字母开头的第一个字母的情况很重要:在许多其他语言中看起来像变量的内容实际上可能是 atom 在Prolog。

如果标识符以小写字母开头,则它不是变量,而是所谓的 atom 。与变量不同,原子是不变的。它们不能通过统一绑定到其他值,因此inRange(i, j, k)不可能正常工作。你需要

inRange(I, J, K) :- K > I, K < J.

现在您的逻辑按预期工作:

:- inRange(0, 10, 5), write(yes).

yes,而目标

:- inRange(0, 10, -1), write(yes).
:- inRange(0, 10, 11), write(yes).
两个都失败了。这是quick demo on ideone

答案 1 :(得分:2)

您可能想要使用变量(必须以大写字母开头):

in_range(X,Y,Z) :- X < Y, X < Z, Y > Z.

现在取决于你如何定义范围内的东西,你可能更喜欢:

in_range(X,Y,Z) :- X =< Y, X =< Z, Z =< Y.

这两个版本要求实例化所有三个数字,这意味着,您只能提出如下问题:

?- in_range(1,10,4).
true.

但不是:

?- in_range(1,10,X).
X=1;
X=2;
...
X=10.

内置谓词between/3怎么样?试试看:

?- between(1,5,3).

?- between(1,5,10).

甚至:

?- between(1,5,X).