2010-10-13 24 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) 
     ). 
相關問題