Paste number 33279: the program in question

Paste number 33279: the program in question
Pasted by: Grue
When:7 years, 9 months ago
Share:Tweet this! | http://paste.lisp.org/+POF
Channel:#lisp
Paste contents:
Raw Source | XML | Display As
(defun logic-symbol (symbol)
  "Указывает соответствие между символами используемыми внутри
программы и теми, которые будут в исходной формуле."
  (case symbol
    (& :and) ;;Или
    (v :or) ;;И
    (> :imp) ;;Следование
    (! :not) ;;Не
    (true :true) ;;Истина
    (false :false) ;;Ложь
    (t nil))) ;;Что-то другое (например переменная)

(defun variablep (symbol)
  "Является ли данный объект переменной?"
  (and (symbolp symbol) (not (logic-symbol symbol))))

(defun elementary-conjunction-p (formula)
  "Является ли формула элементарной коньюнкцией"
  (if (variablep (first formula))
      ;;Если первый элемент формулы переменная
      (if (second formula)
          ;;Если есть второй элемент
          (if (eql (logic-symbol (second formula)) :and)
              ;;Если это ИЛИ - то рекурсивно спускаемся дальше
              (elementary-conjunction-p (cddr formula))
              ;;Если это что-то другое, то все плохо - возвращаем nil
              nil)
          ;;Если в формуле только один элемент...
          t) ;;Значит это тоже элементарная коньюнкция
      ;;Если первый элемент формулы не переменная, то это может быть НЕ.
      (if (eql (logic-symbol (first formula)) :not)
          (elementary-conjunction-p (cdr formula))
          ;;Если же это не НЕ, то все плохо
          nil)))

(defun split-by (formula symbol initial)
  "Разбивает формулу на две части - до и после символа и
  возвращает в виде списка ('первая часть' 'вторая часть').
  initial должен быть nil при вызове функции из других функций."
  (if formula
      (if (eql (logic-symbol (first formula)) symbol)
          (list (reverse initial) (cdr formula))
          (split-by (cdr formula) symbol (cons (car formula) initial)))
      (list (reverse initial) nil)))

(defun partial-dnf (split)
  "Берет часть формулы до первого ИЛИ и возвращает
 хвост (оставшуюся часть), если первая часть была элементарной
 коньюнкцией и :no в противном случае (nil соответствует пустому
 хвосту). В качестве аргумента выступает результат применения
 пред-й функции к формуле."
  (if (elementary-conjunction-p (first split))
      (second split) ;;хвост
      :no))

(defun is-dnf (formula)
  "Является ли формула ДНФ?"
  (if formula
      ;;Если формула непуста
      (if (eql formula :no) 
          nil
          (is-dnf (partial-dnf (split-by formula :or nil))))
      t)) ;;Пустая формула должна считаться ДНФ, чтобы рекурсия работала. 

This paste has no annotations.

Colorize as:
Show Line Numbers

Lisppaste pastes can be made by anyone at any time. Imagine a fearsomely comprehensive disclaimer of liability. Now fear, comprehensively.