在练习中我必须编写一个打印数字的谓词。 N使用repeat / 0,这是我尝试过的:
loop(N) :-
repeat,
write(N), nl,
N is N-1,
write(N),
N > 0,
!.
但它只打印给定数字N Endlessly。
任何想法如何使用repeat/0
实现这一点?谢谢
答案 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()