1

表示函数

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]]

evaluate( DT, X, Y )如果 Y 是通过对值 X 评估决策树 DT 获得的值,我如何为谓词编写 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 ? ;
4

1 回答 1

8

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

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

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.
于 2013-02-23T03:11:35.263 回答