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

时间:2010-10-13 18:21:33

标签: recursion prolog

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

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

print_numbers(10) :- write(10).

print_numbers(X) :- write(X),nl,X is X + 1, print_numbers(X).

4 个答案:

答案 0 :(得分:9)

您的代码非常接近工作。问题是您无法重用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 :(得分: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).

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

答案 2 :(得分:0)

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)
        ).

答案 3 :(得分:0)

只需从终端

调用defineXandY即可
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).