你如何编写Prolog中的程序来使用递归打印1到10的数字?

das*_*sen 6 recursion prolog

你如何编写Prolog中的程序来使用递归打印1到10的数字?

我尝试过以下但它不起作用,你能告诉我为什么吗?

print_numbers(10) :- write(10).

print_numbers(X) :- write(X),nl,X is X + 1, print_numbers(X).
Run Code Online (Sandbox Code Playgroud)

Jef*_*ien 9

您的代码非常接近工作.问题是你不能重复使用X,一旦实例化,它就无法更改(有关更多详细信息,请参见此处).使用一个新变量,如下所示:

print_numbers(10) :- write(10), !.
print_numbers(X) :- write(X), nl, Next is X + 1, print_numbers(Next).
Run Code Online (Sandbox Code Playgroud)

将剪切(!)添加到末尾将阻止解释器询问您是否要查看更多结果.

?- print_numbers(1).
1
2
3
4
5
6
7
8
9
10

Yes
?- 
Run Code Online (Sandbox Code Playgroud)


tor*_*rak 0

自从我写任何序言以来已经有长一段时间了,但我可能会做一些不同的事情。类似这样的东西,虽然我现在无法测试。

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).
Run Code Online (Sandbox Code Playgroud)

这里的一个关键区别是!, 或 cut 操作,它会停止回溯。如果你不包含它,那么当X为 10 时,你将得到第一个子句的解决方案,但如果你要求第二个解决方案,它也会回溯并匹配第二个子句。这会导致数字列表比您想要的大得多。