Напишите программу, которая строит СДНФ и СКНФ для заданной булевой формулы. Формула может быть задана прямо в исходном - Lisp

  1. Напишите программу, которая строит СДНФ и СКНФ для заданной булевой формулы. Формула может быть задана прямо в исходном тексте программы.


textual

Код к задаче: «Напишите программу, которая строит СДНФ и СКНФ для заданной булевой формулы. Формула может быть задана прямо в исходном - Lisp»

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

СДЕЛАЙТЕ РЕПОСТ

9   голосов, оценка 3.889 из 5



Похожие ответы
  1. Напишите функцию format+, которая поддерживает все возможности функции format, но вдобавок позволяет обрабатывать форматную директиву ~z, предназначенную для форматирования страхового номера индивидуального лицевого счета (СНИЛС) гражданина РФ. СНИЛС должен форматироваться следующим образом: ABC-DEF-GHI-CC, где ABC, DEF и GHI – группы из трех цифр, а CC (контрольная сумма) – группа из двух цифр. Контрольная сумма рассчитывается следующим образом: 1. Находится сумма произведений цифр номера на номер их позиции, то есть A*9+B*8+C*7+D*6+E*5+F*4+G*3+H*2+I. 2. Находится остаток от деления суммы на 101 и из него берутся две младших цифры, они и являются контрольной суммой. Аргументом директивы ~z может являться либо целое положительное число, либо строка. Если в числе не хватает значащих цифр, то слева оно дополняется нулями до 11 разрядов. Строка может содержать не более 11 десятичных цифр. В случае недопустимых аргументов и других ошибок считать СНИЛС неправильно сформированным и отображать как [bad SNILS]. Примеры форматирования с помощью директивы ~z: (format+ t "Vasya's ~a = ~z" "SNILS" "00202203341") ==> Vasya's SNILS = 002-022-033-41 (format+ nil "~d: ~z, ~d: ~z" 1 120344511 2 "111abc22233344") ==> "1: [bad SNILS], 2: [bad SNILS]" Замечание: Для упрощения задания можно считать, что директива ~z не поддерживается внутри условной директивы ~[, внутри циклов ~{ и в сочетании с директивами выбора аргументов типа ~:* Подсказка: Разумеется, реализовывать самостоятельно все директивы функции format не нужно. Нужно обработать директиву ~z и затем передать новую форматную строку и измененный список аргументов в функцию format.

  1. Напишите процедуру fringe, которая берет в качестве аргумента дерево (представленное в виде списка) и возвращает список, элементы которого — все листья дерева, упорядоченные слева направо. Например,

  1. Напишите с помощью условной формы IF функцию NOTIMP(x1 x2).

  1. К театральной кассе направляются n человек. Написать программу, которая определяет, сколько различных вариантов очереди могут образовать эти люди. Буду очень признательна, если кто-то поможет решить!

  1. Привет всем. Помогите решить данную задачу. Написать программу, которая вставляет в текст слово после указанного слова. Продолжение поиска слова для вставки слова выполнять по запросу пользователя. (Нужно с использованием обработки строк, функций: concatenate, search, subseq, length). Заранее спасибо)

  1. 1. Напишите функцию трех аргументов (list3 x y z) такую, что (list3 x y z) = (x y z) для любых символьных выражений; не используйте функцию list.

  1. Т.е. помимо этого я не понял как сделать так, чтобы ещё надо было вводить x,y и вывод ответа. Например, f(x,y)=x+y при x,y>0.

  1. Помогите пожалуйста уже 3 неделю бьюсь над этой задачкой, посмотрел кучу тем и не нашел то, что мне нужно. Задание : Напишите функцию, определяющую глубину последнего вхождения элемента Y в список W. Пример: (<имя функции> '(1 2 3 (1 2 3) (( ((3)) 3)) ) 3 ) --> 2; глубину считал с 0