Дерево решений ACL2 не может выполнить рекурсивный вызов - PullRequest
2 голосов
/ 15 мая 2019

Для этой задачи мне поручено реализовать функцию, которая решает вывод дерева решений с учетом данных.Логика: если это символ, то это значение для вывода в противном случае, ищите значение varname в памяти, и если оно меньше или равно пороговому значению, ищите значение в левом дереве, и если оно большечем порог, ищите значение в правом дереве

Дерево решений может быть либо: символом, например, 'versicolor или [порог varname левое дерево правого дерева]

Здесьэто то, что я уже сделал,

(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))

Вот один модульный тест:

(check-expect (decision *IRIS-DECISION-TREE* 
                        (search-list-to-tree '((petal-length 2) 
                                               (petal-width 2)
                                               (sepal-length 5)))) 
              'setosa)

Вот определение используемой константы

(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 DECISION ...): Нет: MEASURE было предоставлено с определением DECISION.»

Я проверил каждое выражение if, чтобы убедиться, что оно работает, и запустил логику кодав моей голове несколько раз, и, похоже, единственной проблемой, с которой я мог столкнуться, может быть ошибка в синтаксисе, но все кажется правильным.

...