如何在Prolog中编写一个程序来使用递归打印1到10的数字?您如何在Prolog中编写一个程序来使用递归来打印从1到10的数字?
我试过以下,但它不起作用,你能告诉我为什么吗?
print_numbers(10) :- write(10).
print_numbers(X) :- write(X),nl,X is X + 1, print_numbers(X).
如何在Prolog中编写一个程序来使用递归打印1到10的数字?您如何在Prolog中编写一个程序来使用递归来打印从1到10的数字?
我试过以下,但它不起作用,你能告诉我为什么吗?
print_numbers(10) :- write(10).
print_numbers(X) :- write(X),nl,X is X + 1, print_numbers(X).
去过,因为我写的任何一个序言严重很长时间,但我可能会做的事情只是有点不同。像这样的东西,虽然我不能在这个地方测试它。
print_increasing_numbers(From, To):- From > To, !, write('ERROR: From > To').
print_increasing_numbers(To, To):- !, write(To).
print_increasing_numbers(From, To):- write(From),
nl,
Next is From + 1,
print_increasing_numbers(Next, To).
这里的一个关键区别是!
或切断操作,它会停止回溯。如果您不包含它,那么当X
为10时,您将得到第一个子句的解决方案,但如果您要求第二个解决方案,它将回溯并匹配第二个子句。这会导致比您想要的更大的数字列表。
您的代码非常接近工作。问题是你不能重用X,一旦它被实例化,它就不能被改变(更多细节见here)。使用一个新的变量,就像这样:(!)
print_numbers(10) :- write(10), !.
print_numbers(X) :- write(X), nl, Next is X + 1, print_numbers(Next).
添加切到年底将防止从翻译询问如果你想看到更多的结果。
?- print_numbers(1).
1
2
3
4
5
6
7
8
9
10
Yes
?-
只是想补充一点。如果其回溯,可以使用重用变量。所以如果你有一个未初始化的值,并且初始化它以获得一个值并且它回溯,它将会转到它未初始化的原始形式,然后当它尝试另一个答案时它会再次初始化。有点像如果你有测试(1)。试验(2)。试验(3)。并输入test(X)。到控制台它会给你1,2和3,因为回溯。 – Matt 2010-10-18 04:15:38
print_from_1_to_10 :-
print_from_X_to_10(1).
print_from_X_to_10(X) :-
(
X > 10
->
fail
;
writeln(X),
NewX is X + 1,
print_from_X_to_10(NewX)
).
MMMMMM,我想,和它不工作,它打印“ ERROR:>/2:参数不能充分地实例化 例外:(7)print_increasing_numbers(_G272 + 1, _G305)?蠕变 “ – dasen 2010-10-13 19:48:08
-1不测试您的代码和不评估”X + 1“ – Kaarel 2010-10-13 22:25:37
@Kaarel:谢谢。已经忘记了序言的行为方面。有了这个修复,并记住将X和Y重命名为From和To,它运行良好。 – torak 2010-10-14 00:52:30