我正在尝试编写一个带有3个整数I,J和K的程序,如果K在I和J的范围内则返回true,如果它超出范围则返回false。
逻辑当然非常简单,但我不太了解Prolog的语法,足以实现它。
我将如何解决此任务。这是我目前得到的代码:
i(10).
j(20).
k(21).
inRange(i, j, k):-
(k > i, k < j).
答案 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).