Lisp ACL2决策树无法执行递归调用
对于这个问题,我被指派实现一个函数,该函数决定给定数据的决策树的输出。 逻辑是: 如果它是一个符号,那么这就是要输出的值,否则,在内存中查找varname的值,如果它小于或等于阈值,则在左树中查找该值,如果它大于阈值,则在右树中查找该值 决策树是: 符号,例如,“versicolor或[varname阈值左树右树] 这是我已经做过的Lisp ACL2决策树无法执行递归调用,lisp,decision-tree,discrete-mathematics,acl2,Lisp,Decision Tree,Discrete Mathematics,Acl2,对于这个问题,我被指派实现一个函数,该函数决定给定数据的决策树的输出。 逻辑是: 如果它是一个符号,那么这就是要输出的值,否则,在内存中查找varname的值,如果它小于或等于阈值,则在左树中查找该值,如果它大于阈值,则在右树中查找该值 决策树是: 符号,例如,“versicolor或[varname阈值左树右树] 这是我已经做过的 (defun decision (tree memory) (if (not (equal (len tree) 0)) (if (not (equ
(defun decision (tree memory)
(if (not (equal (len tree) 0))
(if (not (equal (first tree) (first memory)))
(decision tree (rest memory))
(if (<= (second tree) (second memory))
(decision (third tree) memory)
(decision (fourth tree) memory)))
tree))
下面是所用常数的定义
(defconst *IRIS-DECISION-TREE*
'(petal-length 245/100
setosa
(petal-width 175/100
(petal-length 495/100
(petal-width 165/100
versicolor
virginica)
(petal-width 155/100
virginica
(sepal-length 695/100
versicolor
virginica)))
(petal-length 485/100
(sepal-length 595/100
versicolor
virginica)
virginica))))
当函数到达递归调用时,我不断收到错误。它表示“ACL2错误(DEFUN决策…):否:提供了度量值
决定的定义。”
我测试了每一条if语句,看看它们是否有效,并多次在我的脑海中运行代码的逻辑,似乎唯一的问题可能是语法错误,但似乎一切正常。No:measure消息导致;由于您试图通过归纳法证明,因此需要严格的递减度量,但ACL2本身找不到。也许树的长度可以作为衡量标准,但我对它的了解还不够,无法给出一个实际的例子。第二个
if
看起来有点可疑。如果内存中没有与(第一棵树)
相等的元素,递归将在内存中循环,直到剩余的开始返回nil
,但没有结束条件,因此递归将是无限的。
(defconst *IRIS-DECISION-TREE*
'(petal-length 245/100
setosa
(petal-width 175/100
(petal-length 495/100
(petal-width 165/100
versicolor
virginica)
(petal-width 155/100
virginica
(sepal-length 695/100
versicolor
virginica)))
(petal-length 485/100
(sepal-length 595/100
versicolor
virginica)
virginica))))