2014-01-08 70 views
3

'is/2'Prolog謂詞是如何實現的? 我知道Prolog'is/2'謂詞實現

X is 3*4 

相當於與

is(X, 3*4) 

不過是使用命令式編程實現的謂語? 換句話說,是否與以下C代碼等價?

if(uninstantiated(x)) 
{ 
    X = 3*4; 
} 
else 
{ 
    //signal an error 
} 

還是它使用聲明性編程和其他謂詞來實現?

回答

1

顯然取決於你的Prolog,但是任何實際的實現都會用C或其他命令式語言來完成它的骯髒工作。的is/2部分可以模擬在純序言:

is(X, Expr) :- 
    evaluate(Expr, Value), 
    (var(X) -> 
     X = Value 
    ; 
     X =:= Value 
    ). 

哪裏evaluate是知道算術表達式一個巨大的謂語。有很多方法可以在純Prolog中實現它的大部分,但這會很慢並且很痛苦。例如。如果你有一個謂語,增加了整數,那麼你可以將它們相乘,以及使用以下(笨)算法:

evaluate(X + Y, Value) :- 
    % even this can be done in Prolog using an increment predicate, 
    % but it would take O(n) time to do n/2 + n/2. 
    add(X, Y, Value). 
evaluate(X * Y, Value) :- 
    (X == 0 -> 
     Value = 0 
    ; 
     evaluate(X + -1, X1), 
     evaluate(X1, Y, Value1), 
     evaluate(Y + Value1, Value) 
    ). 

這一切都不是保證無論是實際的還是正確的;我只是展示如何在Prolog中實現算術可以

+0

謝謝。如何在Prolog中實現增量謂詞(用於執行'is/2')。我查了一下,但是我只用'is/2'找到了增量的實現。 我問這一切,因爲我很好奇,如果Prolog可以是純粹的(如在「一切都是一個謂詞」)。 – octavian

+0

@octavian'is/2'是一個謂詞。如果你的意思是「是」應該雙向工作,你意識到對於一般情況,這並不是很有用(2是1 + 1; 2是0 + 2; 2是4/2; 2是sqrt(4); ...)。然而,約束邏輯編程更接近你的意思。 – 2014-01-08 19:26:19

+0

更仔細地閱讀你的答案,這不完全正確。很可能,你的例子中的if/else不是必須的;相反,您將評估_Expr_並嘗試用_X_將其統一。這就是爲什麼'/ 2'和'=:='(算術等式)可以有相同參數的不同答案。 – 2014-01-08 20:13:01

0

將取決於Prolog的版本;例如,CProlog是(不出所料)用C語言編寫的,所以所有內置的謂詞都是用命令式語言來實現的。

0

Prolog是爲語言解析開發的。因此,一個算術表達式像

3 + - (4 * 12)/2 + 7 

解析後只是一個Prolog項(表示分析樹),與operator/3提供語義引導解析器的操作。對於基本的算術表達式,術語是

  • '-'/2。 Negation
  • '*'/2'/'/2。乘法,除法
  • '+'/2,'-'/2。加法,減法

樣品表達上述被解析爲

'+'('+'(3 , '/'('-'('*'(4,12)) , 2)) , 7) 

'is'/2簡單地做的解析樹的遞歸步行表示右手側,在幾乎評估每個術語以相同的方式的RPN (反向波蘭標記)計算器。一旦表達式被評估,結果與左側統一。

每個基本操作—加,減,乘,除等—在機器代碼來完成,所以在一天結束時,一些機器代碼程序被調用,以計算每一元素運算的結果。

無論是is/2是完全用本地代碼編寫還是大部分編寫在prolog中,只用本地代碼編寫的葉子操作,幾乎都是實現選擇。