Recursion 您将如何在Prolog中编写程序,使用递归打印从1到10的数字?

Recursion 您将如何在Prolog中编写程序,使用递归打印从1到10的数字?,recursion,prolog,Recursion,Prolog,您将如何在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):-

您将如何在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,一旦它被实例化,就不能更改它(有关更多详细信息,请参阅)。使用新变量,如下所示:

print_numbers(10) :- write(10), !.
print_numbers(X) :- write(X), nl, Next is X + 1, print_numbers(Next).
将cut(!)添加到末尾将阻止解释器询问您是否希望看到更多结果

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

Yes
?- 
只需从终端呼叫defineXandY

defineXandY:-
打印一到十(1,10)。
打印一到十(X,Y):-

XMmmmmm,我试过了,但它不起作用,它打印“1错误:>/2:参数没有充分实例化异常:(7)打印递增的数字(\u G272+1,\u G305)?爬行”@Kaarel:谢谢。我已经忘记了prolog行为的这一方面。修复完成后,请记住将X和Y重命名为From和to,运行良好。只需在此基础上添加。如果变量被回溯,则可以使用重用变量。所以,如果你有一个未初始化的值,你初始化它以获得一个值,它会返回到原始的未初始化形式,然后当它尝试另一个答案时,它会再次初始化。有点像你的测试(1)。测试(2)。测试(3)。然后输入测试(X)。对于控制台,由于回溯,它将为您提供1、2和3。虽然此代码片段可以解决此问题,但确实有助于提高您文章的质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。还请尽量不要用解释性注释挤满你的代码,这会降低代码和解释的可读性!
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)
        ).
defineXandY :-
    print_one_to_ten(1,10).

print_one_to_ten(X,Y) :- 
    X<Y,
    write(X),nl,
    NewX is X+1,
    print_one_to_ten(NewX,Y).