'is / 2'Prolog谓词是如何实现的? 我知道
X is 3*4
等同于
is(X, 3*4)
但是使用命令式编程实现了谓词吗? 换句话说,实现是否与以下C代码等效?
if(uninstantiated(x))
{
X = 3*4;
}
else
{
//signal an error
}
或者它是使用声明性编程和其他谓词实现的吗?
答案 0 :(得分:1)
显然,取决于您的Prolog,但任何实际的实现都将用C或其他命令式语言进行肮脏的工作。部分is/2
可以用纯Prolog模拟:
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中实现算术 。
答案 1 :(得分:0)
取决于Prolog的版本;例如,CProlog(不出所料)用C语言编写,因此所有内置谓词都以命令式语言实现。
答案 2 :(得分:0)
Prolog是为语言分析而开发的。所以,算术表达式如
3 + - ( 4 * 12 ) / 2 + 7
解析后的只是一个序言术语(代表解析树),operator/3
提供语义来指导解析器的操作。对于基本算术表达式,术语是
'-'/2
。否定'*'/2
,'/'/2
。乘法,除法'+'/2
,'-'/2
。加法,减法上面的示例表达式被解析为
'+'( '+'( 3 , '/'( '-'( '*'(4,12) ) , 2 ) ) , 7 )
'is'/2
只是对表示右侧的解析树进行递归遍历,以与RPN(反向抛光表示法)计算器完全相同的方式评估每个术语。一旦评估了该表达式,结果将与左侧统一。
每个基本操作 - 加,减,乘,除等 - 都必须在机器代码中完成,因此在一天结束时,会调用一些机器代码例程来计算每个元素操作的结果。
is/2
是完全用本机代码编写还是主要用prolog编写,只用本机代码编写的叶操作,几乎是一种实现选择。