2015-12-05 187 views
0

我對我的CS任務有些麻煩。我試圖調用之前在一個新規則中創建的另一條規則,該規則將計算冪函數的階乘(例如Y =(N^X)!)。我認爲我的代碼的問題是exp(Y,X,N)中的Y在我稱爲階乘(Y,Z)時沒有繼續,儘管我並不完全確定。我一直在試圖找到一個這樣的例子,但我一直無法找到任何東西。Prolog遞歸(功率函數的階乘)

我不期待答案,因爲這是家庭作業,但任何幫助將不勝感激。

這裏是我的代碼:

/* 1.2: Write recursive rules exp(Y, X, N) to compute mathematical function Y = X^N, where Y is used 
to hold the result, X and N are non-negative integers, and X and N cannot be 0 at the same time 
as 0^0 is undefined. The program must print an error message if X = N = 0. 
*/ 

exp(_,0,0) :- 
    write('0^0 is undefined'). 

exp(1,_,0). 

exp(Y,X,N) :- 
    N > 0, !, N1 is N - 1, exp(Y1, X, N1), Y is X * Y1. 

/* 1.3: Write recursive rules factorial(Y,X,N) to compute Y = (X^N)! This function can be described as the 
factorial of exp. The rules must use the exp that you designed. 
*/ 

factorial(0,X) :- 
    X is 1. 

factorial(N,X) :- 
    N> 0, N1 is N - 1, factorial(N1,X1), X is X1 * N. 

factorial(Y,X,N) :- 
    exp(Y,X,N), factorial(Y,Z). 
+1

注意,您會在'factorial/3'的主體中得到一個關於'Z'的單例變量警告。你的問題可能在那裏。如果你得到一個單例錯誤警告,並且你不知道該怎麼做,請嘗試用'_'替換該變量。如果由此產生的表達沒有意義,你可以告訴你有更深的問題。 –

+0

@DanielLyons好了,所以我解決了你現在提出的問題,看起來問題似乎是程序執行X^N,但是它不會繼續計算它的階乘。 – Jordanthedud

+0

嘗試使用'trace'來調試它。我的期望是,你有一個有趣的順序變量,你可能意味着像'factorial(Y,X,N): - exp(F,X,N),階乘(Y,F)'。 –

回答

1

在階乘/ 3中提到的變量z(只提到一次;所謂的「單變量」,永遠不能得到統一用什麼...)。

注意到問題的註釋,將它短路到_將不起作用,您必須將它與一個合理的值統一起來(你想要計算/將子句的頭部與exp相關聯,並且通過參數析取factorial =>引入一些參數「中間」/頭部未提及)。

編輯:我會重新命名你的變量,你也許你會本身更清楚你做了什麼:

factorial(Y,X,Result) :- 
    exp(Y,X,Result), factorial(Y,UnusedResult). 

現在你應該可以看到你的階乘/ 3計算真的是什麼,以及如何解決它。

+0

讀兩個句子:我說如果你用'_'替換一個單例,結果是沒有意義的(在這種情況下它不會),那麼你的推理是有缺陷的。一些初學者與單變量變量警告糾纏在一起,這有助於向他們展示問題。 –

+0

你的建議對我毫無意義。單身警告不是致命的,代碼的含義也是相同的。我建議恰恰相反,要認真思考單身人士出現的「參數位置」的意義。 OP只是偶然地寫下了一些變量名,甚至沒有想到每個代表什麼...... –

+0

除了錯誤的根源在哪裏,我們同意所有的事情。真正的錯誤在學生的腦海裏。他們來自C,他們不明白單身人士警告的嚴重程度。我的建議並沒有改變對Prolog的含義 - 但是做出改變往往有助於學生_看到Prolog正在做什麼的心理模型是有缺陷的。我們有同樣的目標:讓OP認真思考這個位置的含義。請記住,90%的Prolog問題來自於經驗豐富的程序員程序員,從Prolog開始。他們的直覺往往是更深層次的問題。 –