2010-10-13 45 views

回答

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时,您将得到第一个子句的解决方案,但如果您要求第二个解决方案,它将回溯并匹配第二个子句。这会导致比您想要的更大的数字列表。

+0

MMMMMM,我想,和它不工作,它打印“ ERROR:>/2:参数不能充分地实例化 例外:(7)print_increasing_numbers(_G272 + 1, _G305)?蠕变 “ – dasen 2010-10-13 19:48:08

+0

-1不测试您的代码和不评估”X + 1“ – Kaarel 2010-10-13 22:25:37

+0

@Kaarel:谢谢。已经忘记了序言的行为方面。有了这个修复,并记住将X和Y重命名为From和To,它运行良好。 – torak 2010-10-14 00:52:30

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 
?- 
+0

只是想补充一点。如果其回溯,可以使用重用变量。所以如果你有一个未初始化的值,并且初始化它以获得一个值并且它回溯,它将会转到它未初始化的原始形式,然后当它尝试另一个答案时它会再次初始化。有点像如果你有测试(1)。试验(2)。试验(3)。并输入test(X)。到控制台它会给你1,2和3,因为回溯。 – Matt 2010-10-18 04:15:38

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) 
     ). 
相关问题