表示功能
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 ? ;
答案 0 :(得分:8)
我发现你的中间表现有点反直觉。可以公平地说,列表应该被理解为一个三元组,例如:[TrueValue, Condition, ElseValue]
,其中TrueValue
和FalseValue
可以是值或其他有条件的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.