1

演習では、repeat/0を使用してN未満の数値を出力する述語を作成する必要があります。これが私が試したことです。

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

ただし、指定された数Nを無限に出力するだけです。

これを使用してこれを実装する方法についてのアイデアはありますかrepeat/0?ありがとうございました

4

7 に答える 7

2

私はついに述語を使用してそれを機能させることができました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.
于 2012-11-10T16:38:34.320 に答える
2

アサート/リトラクトを使用できます。

:- 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,
    !.
于 2012-11-10T15:58:34.340 に答える
2

どうですか:

loop(N) :-
        between(1, N, X),
        writeln(X),
        false.
于 2012-11-10T17:54:10.463 に答える
2

オリジナルのものはさまざまな理由で機能しませんが、特に

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

「is」は、左側が右側の数学的な結果であるかどうかを統合します。左側が右側にバインドされます。Prologで設定した変数の値を変更することはできません。

于 2012-11-10T20:36:22.187 に答える
1

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.
于 2012-11-11T04:00:57.827 に答える
1

サービス述語を紹介します

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

これは、新しい変数をスコープするために必要です(Anniepooが最初の応答で強調した点を実際に解決します)。

それから私は書くことができました

loop(N) :-
  repeat,
  isint(I),
  write(I), nl,
  I >= N, !.
于 2012-11-11T06:32:25.603 に答える
0

簡単な方法:

loop(N) :-
    between(1, N, X),
    writeln(X),
    X >= N, !.
    loop(X).
于 2018-05-21T16:41:13.837 に答える