演習では、repeat/0を使用してN未満の数値を出力する述語を作成する必要があります。これが私が試したことです。
loop(N) :-
repeat,
write(N), nl,
N is N-1,
write(N),
N > 0,
!.
ただし、指定された数Nを無限に出力するだけです。
これを使用してこれを実装する方法についてのアイデアはありますかrepeat/0
?ありがとうございました
演習では、repeat/0を使用してN未満の数値を出力する述語を作成する必要があります。これが私が試したことです。
loop(N) :-
repeat,
write(N), nl,
N is N-1,
write(N),
N > 0,
!.
ただし、指定された数Nを無限に出力するだけです。
これを使用してこれを実装する方法についてのアイデアはありますかrepeat/0
?ありがとうございました
私はついに述語を使用してそれを機能させることができました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.
アサート/リトラクトを使用できます。
:- 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,
!.
どうですか:
loop(N) :-
between(1, N, X),
writeln(X),
false.
オリジナルのものはさまざまな理由で機能しませんが、特に
loop(N) :-
repeat,
write(N), nl,
N is N-1, <--- no!
write(N),
N > 0,
!.
「is」は、左側が右側の数学的な結果であるかどうかを統合します。左側が右側にバインドされます。Prologで設定した変数の値を変更することはできません。
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.
サービス述語を紹介します
isint(I) :- I = 0 ; isint(T), I is T + 1.
これは、新しい変数をスコープするために必要です(Anniepooが最初の応答で強調した点を実際に解決します)。
それから私は書くことができました
loop(N) :-
repeat,
isint(I),
write(I), nl,
I >= N, !.
簡単な方法:
loop(N) :-
between(1, N, X),
writeln(X),
X >= N, !.
loop(X).