Функция для упрощения выражения - Lisp

Узнай цену своей работы

Формулировка задачи:

Сначала я создал функцию которая трансформирует инфиксную форму в префиксную.
(defun infixToPrefix(l)
    (cond ((null l) nil) 
         ((equal (length l) 1)(car l))
        ((not(member (car l) `(+ -))) 
         (list (cadr l)(infixToPrefix(cddr l))(car l)))))
(infixToPrefix (reverse`(A + B + C))) 
;(infixToPrefix (reverse`(A - B - C)))
Результат получился таков: (+ (+ A B) C) Bторая задача была для упрощения выражения: Пример: (+ (+ A B) C) -> (+ A B C) или (- (- A B) C) -> (- A B C) Спасибо заранее.

Решение задачи: «Функция для упрощения выражения»

textual
Листинг программы
(defun simp (ex)
  (cond ((atom ex) ex)
        (t (let ((s1 (car ex))
                  (s2 (car (cadr ex)))
                  (v1 (simp (cadr (cadr ex))))
                  (v2 (simp (caddr (cadr ex))))
                  (v3 (simp (caddr ex))))
            (if (eq s1 s2) (list s1 v1 v2 v3) (list s1 (list s2 v1 v2) v3))))))       
 
==> SIMP
 
(simp '(+ (+ a b) c))
 
==> (+ A B C)
 
(simp '(+ (- a b) c))
 
==> (+ (- A B) C)
 
(simp '(- (- a b) c))
 
==> (- A B C)

Объяснение кода листинга программы

В данном коде представлена функция SIMP, которая принимает на вход выражение EX и возвращает упрощённое выражение. Функция реализована с помощью рекурсии и условного оператора COND. Если EX является атомом, то SIMP возвращает его же. Если EX — это не атом, то:

  1. Значение первого элемента EX (s1) сохраняется в отдельной переменной.
  2. Значение второго элемента EX (s2) сохраняется в отдельной переменной.
  3. Вызывается функция SIMP для третьего элемента EX (v1).
  4. Вызывается функция SIMP для четвёртого элемента EX (v2).
  5. Вызывается функция SIMP для пятого элемента EX (v3).
  6. Если s1 равно s2, то возвращается упрощённое выражение, иначе возвращается список [s1, v1, v2, v3].

Оцени полезность:

10   голосов , оценка 4.7 из 5
Похожие ответы