'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
}
還是它使用聲明性編程和其他謂詞來實現?
'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
}
還是它使用聲明性編程和其他謂詞來實現?
顯然取決於你的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中實現算術可以。
將取決於Prolog的版本;例如,CProlog是(不出所料)用C語言編寫的,所以所有內置的謂詞都是用命令式語言來實現的。
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中,只用本地代碼編寫的葉子操作,幾乎都是實現選擇。
謝謝。如何在Prolog中實現增量謂詞(用於執行'is/2')。我查了一下,但是我只用'is/2'找到了增量的實現。 我問這一切,因爲我很好奇,如果Prolog可以是純粹的(如在「一切都是一個謂詞」)。 – octavian
@octavian'is/2'是一個謂詞。如果你的意思是「是」應該雙向工作,你意識到對於一般情況,這並不是很有用(2是1 + 1; 2是0 + 2; 2是4/2; 2是sqrt(4); ...)。然而,約束邏輯編程更接近你的意思。 – 2014-01-08 19:26:19
更仔細地閱讀你的答案,這不完全正確。很可能,你的例子中的if/else不是必須的;相反,您將評估_Expr_並嘗試用_X_將其統一。這就是爲什麼'/ 2'和'=:='(算術等式)可以有相同參數的不同答案。 – 2014-01-08 20:13:01