2012-11-30 94 views
0

我目前正在嘗試創建一個簡單的函數,該函數在給定第一個和最後一個數字的列表中輸出整數。簡單的遞歸Prolog函數

例如,函數調用:數(3,7,Z)將打印 「Z = [3,4,5,6,7]」

這裏是我的嘗試至今:

count(First,Last,Result):- 
    First <= Last, 
    append(First,Result,Result), 
    count(First+1,Last,Result). 

我究竟做錯了什麼?這個想法是,只要First小於或等於last,序列就會一直附加到結果列表中。

在此先感謝!我一直在爭取這一段時間!

回答

1

一行一行:

  1. count(First,Last,Result):-

    不良作風:名稱提出另一個功能

  2. First <= Last,

    了 '小於或等於' 運算符= <

  3. append(First,Result,Result),

    你傳遞INT,LIST LIST,但附加/ 3有簽名列表,列表,列表和 你想要的值更新,但在Prolog的變量是 '一成不變',這樣的呼叫能成功只有當結果不改變

  4. count(First+1,Last,Result).

    算術表達式必須明確評估,在這裏你傳遞一個結構+(一,1)

而且您還錯過了編寫測試(一旦糾正)失敗時所需的行爲。那First>Last呢?

0

你的程序有很多問題。首先,當您編寫3 + 2時,Prolog不像其他語言那樣計算結果。您必須明確要求執行計算並將謂詞is(例如X is 3 + 2, ...)的計算結果綁定到變量,然後您將有X綁定到5以用於規則尾部的其餘部分。

其次,寫append(First, Result, Result)手段「通過附加FirstResult再次獲得Result」,它總是會失敗(讀:生產false),除非First是空列表,因爲如果你添加一些東西到一個列表,您將獲得一個比你開始的列表更長。你顯然未能區分appendcount中的兩個Result - 它們確實不一樣。還要注意,append(A, B, C)適用於列表,因此ABC必須全部是可以實例化爲列表的列表或術語,否則將失敗。這正是你的情況,因爲First始終是一個數字 - 絕對不是一個列表,而是一個會員。因此,您不得使用append:使用列表構造和與=的統一將元素附加到列表並將獲得的結果綁定到變量,例如X = [Element | List]

最後,如果上述所有內容都正確,則謂詞將失敗,因爲您沒有定義歸納的基本情況。換句話說:當你的謂詞應該回答[]?正如CapelliC所言,這必須發生,First > Last:在這種情況下,範圍是空的,並且Result也必須是。在你的程序中,當發生這種情況時,謂詞明顯失敗(請注意,當你寫foo(X, Y) :- X >= 0, Y is X + 1.時,這意味着只要X小於零就表示失敗)。作爲遞歸的基本情況是空的範圍,你的謂詞的評估遲早會結束,所以它總是失敗。

最後,你應該寫這樣的:

ints(First, Last, Interval) :- First > Last -> Interval = [] ; 
    NFirst is First + 1, ints(NFirst, Last, NInterval), Interval = [First | NInterval]. 

(我給更多的聲明名字謂詞和變量)。當然這個謂詞只有在第一個和最後一個被完全實例化爲數字的情況下才能起作用(它不能被顛倒)。