Напишите программу, которая строит СДНФ и СКНФ для заданной булевой формулы. Формула может быть задана прямо в исходном - Lisp
Формулировка задачи:
Напишите программу, которая строит СДНФ и СКНФ для заданной булевой формулы. Формула может быть задана прямо в исходном тексте программы.
Решение задачи: «Напишите программу, которая строит СДНФ и СКНФ для заданной булевой формулы. Формула может быть задана прямо в исходном»
textual
Листинг программы
(define data '((-x1 -x2 -x3 #t) (-x1 -x2 x3 #t) (-x1 x2 -x3 #f) (-x1 x2 x3 #t) (x1 -x2 -x3 #f) (x1 -x2 x3 #f) (x1 x2 -x3 #f) (x1 x2 x3 #t))) (define (find-diff x y) (if (eqv? (length x) (length y)) (let loop ((x x) (y y) (n 0) (acc '())) (cond ((> n 1) #f) ((null? x) (reverse acc)) (else (let ((flag (eq? (first x) (first y)))) (loop (rest x) (rest y) (if flag n (add1 n)) (if flag (cons (first x) acc) acc)))))) #f)) (define (disjunctive-normal-form table) (let ((terms (map (lambda (t) (remove #t t)) (filter (lambda (term) (first (reverse term))) table)))) terms)) (disjunctive-normal-form data)
Объяснение кода листинга программы
В коде представлена реализация функции для построения СДНФ (Disjunctive Normal Form) и СКНФ (Conjunctive Normal Form) для заданной булевой формулы. Булева формула представлена в виде таблицы, где каждая строка соответствует одному выражению, а столбцы соответствуют переменным.
- В переменной
data
хранится таблица с булевой формулой. - Функция
find-diff
используется для поиска разности между двумя последовательностями. - Функция
disjunctive-normal-form
принимает таблицу и возвращает список термов в СДНФ. - В функции
disjunctive-normal-form
используется функцияmap
для удаления значений#t
из таблицы. - Затем, с помощью функции
filter
, из таблицы удаляются строки, содержащие только одно выражение. - Результатом работы функции
disjunctive-normal-form
является список термов в СДНФ для заданной булевой формулы. - В конце кода вызывается функция
disjunctive-normal-form
с аргументомdata
, чтобы получить СДНФ для заданной булевой формулы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д