如何在prolog中使用repeat / 0打印一组数字?

时间:2012-11-10 15:18:33

标签: prolog

在练习中我必须编写一个打印数字的谓词。 N使用repeat / 0,这是我尝试过的:

loop(N) :-
    repeat,
        write(N), nl,
        N is N-1,
        write(N),
        N > 0,
    !.

但它只打印给定数字N Endlessly。

任何想法如何使用repeat/0实现这一点?谢谢

7 个答案:

答案 0 :(得分:3)

你可以使用assert / retract例如

:- dynamic value/1.
loop(N) :-
    retractall(value(_)),
    assert(value(N)),
    repeat,
            retract(value(V)),
            writeln(V),
            V1 is V - 1,
            assert(value(V1)),
            V = 0,
    !.

答案 1 :(得分:3)

怎么样:

loop(N) :-
        between(1, N, X),
        writeln(X),
        false.

答案 2 :(得分:2)

原始版本由于各种原因无效,但特别是

loop(N) :-
    repeat,
        write(N), nl,
        N is N-1,                <--- no!
        write(N),
        N > 0,
    !.
如果左侧是右侧的数学结果,则

“是”统一。 左侧将绑定到右侧。 一旦在Prolog中设置了var,就无法更改它的值。

答案 3 :(得分:2)

Abderrahmane询问如何减少。

有几种方法可以做到这一点。大多数人会这样做

dec(0).
dec(N) :-
   write(N), nl,
   NewN is N - 1,
   dec(NewN).

如果你坚持一个故障驱动的循环,怎么样

dec(N) :-
    between(1,N,X),
    Dec is 11 - X,
    write(Dec), nl,
    Dec = 1.

或者,这是丑陋和糟糕的风格(和糖蜜一样慢):

dec(N) :-
      assert(current_n(N)),
      repeat,
      current_n(Y),
      write(Y), nl,
      NewY is Y - 1,
      retractall(current_n(_)).
      assert(current_n(NewY)),
      Y > 0.

答案 4 :(得分:1)

我终于使用谓词between/3使其工作了这是我的最终代码:

loop(N) :-
    repeat,
        between(1, N, X),
        writeln(X),
        X = N,
    !.

编辑: 正如@CookieMonster所说,不需要repeat/0,所以这是代码的最后一个版本:

loop(N) :-
        between(1, N, X),
        writeln(X),
        false.

答案 5 :(得分:1)

我会介绍一个服务谓词

isint(I) :- I = 0 ; isint(T), I is T + 1.

这需要在 new 变量中进行范围化(实际上解决了Anniepoo在第一次回复中强调的观点)。

然后我可以写

loop(N) :-
  repeat,
  isint(I),
  write(I), nl,
  I >= N, !.

答案 6 :(得分:0)

一种简单的方法:

a()