Prolog'是/ 2'谓词实现

时间:2014-01-08 16:26:13

标签: prolog imperative-programming declarative-programming

'is / 2'Prolog谓词是如何实现的? 我知道

X is 3*4

等同于

is(X, 3*4)

但是使用命令式编程实现了谓词吗? 换句话说,实现是否与以下C代码等效?

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

或者它是使用声明性编程和其他谓词实现的吗?

3 个答案:

答案 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编写,只用本机代码编写的叶操作,几乎是一种实现选择。