2013-11-23 76 views
1

我正在做一個練習來計算數字中的偶數位數。這是該計劃。是否可以在Prolog中更改已初始化的變量?

count_even(Number, 1) :- 
    Number < 10, 
    even(Number). 

count_even(Number, 0) :- 
    Number < 10, 
    odd(Number). 

count_even(Number, Count) :- 
    Number >= 10, 
    split_number(Number, Digit, NewNumber), 
    count_even(NewNumber, NumCount), 
    DigCount is mod(Digit + 1, 2), 
    Count is NumCount + DigCount. 

split_number(Number, Digit, NewNumber) :- 
    Digit is mod(Number, 10), 
    NewNumber is Number//10. 

even(Number) :- 
    0 is mod(Number, 2). 

odd(Number) :- 
    1 is mod(Number, 2). 

現在我想知道是否真的有必要在第三count_even有一個NumCount。如果我第三count_even的代碼更改

count_even(Number, Count) :- 
    Number >= 10, 
    split_number(Number, Digit, NewNumber), 
    count_even(NewNumber, Count), 
    DigCount is mod(Digit + 1, 2), 
    Count is Count + DigCount. 

現在該程序將無法完成其工作了,因爲如果DigCount等於1。我的問題是,如果這樣的事情是可能Count is Count + DigCount將失敗。是否可以強制Count is Count + DigCount像C#或Java語言一樣執行?也就是說,只要進行計算,並且在實例化Count的情況下不會將其視爲一條規則?

+0

編號'Count is Count + DigCount'等價於'Count =:= Count + DigCount'。在* Prolog *中,就是。 :)有['nb_setarg'](http://www.swi-prolog.org/pldoc/doc_for?object=nb_setarg/3)和['nb_setval'](http://www.swi-prolog.org/pldoc/man?predicate = nb_setval/2)雖然... –

+3

請不要使用prolog作爲命令式語言。事實上,prolog中沒有可以初始化的「編程變量」,但是可以統一的邏輯變量。 – rano

+0

沒有理由在此上下文中重複使用「Count」。爲什麼不調用'count_even(NewNumber,Count1)'然後'Count是Count1 + DigCount'? – lurker

回答

1

簡短的回答是否定的。由於Prolog變量可以是統一的或不統一的,並且可以容易地假設它嚴格意味着統一是實例化並且導致相信您可以再次通過統一它或者不考慮它的邏輯變量一個被證明是正確的邏輯公式(就像你的情況一樣)。

確實有一些技巧,就像Will Ness說的那樣,以某些元謂語的形式讓你操縱語言計算器(因爲序言是homoiconic language)但它們不是ISO,它們是依賴於實現的,最重要的是它們就像是一個在這種情況下拍攝蒼蠅的大炮。

也許別人會對如何嘗試將邏輯結構解釋爲實現命令式語言結果的手段提出一些更好的建議,我會指示您將一個Horn邏輯子句的解釋作爲一個命令過程by Kowalski

+0

此外,可以[使用[Constraint] [自動將命令式算法轉換爲Prolog](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.212.5370&rep=rep1&type=pdf)處理規則](http://www.swi-prolog.org/pldoc/man?section=chr)。 –

相關問題