我正在尝试编写一个程序,它采用 3 个整数 I、J 和 K,如果 K 在 I 和 J 的范围内,则返回 true,如果超出范围,则返回 false。
逻辑当然非常简单,但我对 Prolog 的语法理解不够,无法实现它。
我将如何解决这个任务。这是我目前得到的代码:
i(10).
j(20).
k(21).
inRange(i, j, k):-
(k > i, k < j).
我正在尝试编写一个程序,它采用 3 个整数 I、J 和 K,如果 K 在 I 和 J 的范围内,则返回 true,如果超出范围,则返回 false。
逻辑当然非常简单,但我对 Prolog 的语法理解不够,无法实现它。
我将如何解决这个任务。这是我目前得到的代码:
i(10).
j(20).
k(21).
inRange(i, j, k):-
(k > i, k < j).
需要记住的 Prolog 语法的第一条规则是以字母开头的事物中的第一个字母的大小写很重要:在许多其他语言中看起来像变量的东西实际上可能是 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).
都失败了。这是关于 ideone 的快速演示。
您可能想要使用变量(必须以大写字母开头):
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).