使用Prolog进行决策树评估

时间:2013-02-22 23:25:12

标签: prolog

表示功能

f(x) =
    if x < -2 then -1
    else
        if x > 2 then +1
        else
            0

决策树表示为

[-1, [lt, -2], [1, [gt, 2], 0] ]

同样,代表函数

f(x) =
    if x < 0 then
       if x < -3 then -1
       else 0
    else
       if x < 3 then +1
       else +2

我们使用树:

[-1,[lt,-3],0],[lt,0],[1,[lt,3],2]]

如果Y是通过在值X上评估决策树DT获得的值,如何为evaluate( DT, X, Y )谓词编写Prolog代码?

示例输入和输出如下:

?- evaluate([-1,[lt,-2],[1,[gt,2],0]],1,X).
X = 0 ? ;

?- evaluate([[-1,[lt,-3],0],[lt,0],[1,[lt,3],2]],7,X).
X = 2 ? ;

1 个答案:

答案 0 :(得分:8)

我发现你的中间表现有点反直觉。可以公平地说,列表应该被理解为一个三元组,例如:[TrueValue, Condition, ElseValue],其中TrueValueFalseValue可以是值或其他有条件的3元组?假设这是正确的理解,我会回答。

您在这里得到的是一个基本的抽象语法树(AST)。我们将有两种模式:一个值,或一个三元组。评估价值很容易:

evaluate(Value, _, Value) :- number(Value).

有了这个,评估条件非常简单:

evaluate([TrueCase, Condition, FalseCase], X, Result) :-
  evaluate_condition(Condition, X) 
      -> evaluate(TrueCase, X, Result)
       ; evaluate(FalseCase, X, Result).

我已将条件检查自身移动到单独的谓词中。这样可以方便地添加新运算符。现在我们只需要对其进行编码:

evaluate_condition([lt, Y], X) :- X < Y.
evaluate_condition([gt, Y], X) :- X > Y.

这甚至比你希望的好一点,因为它不会产生虚假的选择点:

?- evaluate([-1,[lt,-2],[1,[gt,2],0]],1,X).
X = 0.

?- evaluate([[-1,[lt,-3],0],[lt,0],[1,[lt,3],2]],7,X).
X = 2.