在Prolog中显示前100个整数

时间:2014-08-21 13:32:51

标签: prolog

我是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个整数的程序。有人可以帮我这个。 谢谢!

3 个答案:

答案 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的定义如下:

N &gt; = Lower N =&lt;

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/3forall/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)

我的第二个@Kay的回答。如果可能,请不要使用副作用并使用代替!

如果您的Prolog实施提供,您可以这样做:

config.xml