我是prolog的新手,我正在尝试编写一个简单的程序,它将显示前100个整数。
is_integer(0).
is_integer(X) :-
is_integer(Y),
( Y >= 100, ! ; X is Y + 1 ).
它运作良好,但当我们询问2.1是否为整数时,它会回复" true"。这是因为2.1介于0和100之间。
但是我想要一个只能严格显示前100个整数的程序。有人可以帮我这个。 谢谢!
答案 0 :(得分:3)
如果你不想使用像between(0, 100, X)
这样的预定义函数,我认为这符合你的风格:
between0_100(X) :-
(var(X) -> true ; X >= 0), % either X is unbound or >= 0.
between0_100(0, X).
between0_100(X, X).
between0_100(X, Y) :-
Z is X + 1, % increment X
Z =< 100, % and test if it is <= 100
between0_100(Z, Y). % recurse
?- between0_100(X).
X = 0 ;
X = 1 ;
X = 2 ;
…
X = 98 ;
X = 99 ;
X = 100 ;
false.
?- between0_100(2.1).
false
答案 1 :(得分:1)
你是什么意思&#34;显示&#34;?
(非常标准的)谓词between/3
的定义如下:
between(Lower, Upper, N)
为真上。如果 N 是一个整数,它将成功或失败,如果它不是整数则抛出错误。如果 N 是一个自由变量,它将通过回溯来枚举解决方案。我很确定你可以在StackOverflow的其他地方找到between/3
的合理实现。
或者你的意思是你输入:
?- first_100_ints.
你得到:
0
1
2
3
4
...
99
您可以按照以下方式执行此操作:
first_100_ints :-
next_int(0, 100).
next_int(X, Upper) :-
( X < Upper
-> format('~d~n', [X]),
succ(X, X1),
next_int(X1, Upper)
; true
).
这是一个&#34;便宜&#34;这样做的方式。但请记住,这通常不是您想要编写Prolog程序的方式。一种更好的方法是使用内置插件between/3
和forall/3
:
?- forall(between(0, 99, X), format('~d~n', [X])).
这等同于:
?- \+ (between(0, 99, X), \+ format('~d~n', [X])).
读取的内容为&#34; 0到99之间没有数字(含),你不能打印出数字&#34;。请参阅here。
您可以做其他事情,具体取决于您的确切目标。
答案 2 :(得分:1)