Создание простейшего автомата на языке Lisp

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

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

Доброго времени суток! Коллеги, нужна ваша помощь. Лисп для меня язык новый и непривычный, а на носу зачет и необходимо сделать программу. Есть основа, но с ней что-то не так, прошу помощи!)) Итак, дан алфавит {A-An, B-Bm, C-Ck}. Проверить соответствует ли список данному алфавиту. [ ] - true [aaaaaaa] -true [aaaabbb] -true [abc] - true [bbbcccc] -true [aaaaaaccccbb] - false [cba] -false _____________________________________________________
(defun aabbcc (x) 
    ( if (eq (car (x) 'a)
        (T
            (aabbcc (cdr x)))
        (nill 
            (if (eq (car (x) 'b)
                (T
                    (aabbcc (cdr x)))
                (nill
                    (if (eq (car (x) 'c)
                        (T
                            (aabbcc (cdr x))))))

Решение задачи: «Создание простейшего автомата на языке Lisp»

textual
Листинг программы
(defun DFA (l &optional (state 'q0) (VT '(a b c)))
    (cond
        ((null l) 
            (if (eq state 'q2) 
                "ДКА пришел в конечное состояние"
                "ДКА не пришел в конечное состояние"))
        ((eq state 'q0) 
            (cond 
                ((eq (car l) 'a) (DFA (cdr l) state VT))
                ((eq (car l) 'b) (DFA (cdr l) 'q1 VT))
                (t (if (not (member (car l) VT))
                    "Терминал не принадлежит алфавиту языка"
                    "ДКА не пришел в конечное состояние"))))
        ((eq state 'q1) 
            (cond 
                ((eq (car l) 'b) (DFA (cdr l) state VT))
                ((eq (car l) 'c) (DFA (cdr l) 'q2 VT))
                (t (if (not (member (car l) VT))
                    "Терминал не принадлежит алфавиту языка"
                    "ДКА не пришел в конечное состояние"))))
        (t (eq state 'q2) 
            (if (eq (car l) 'c) 
                (DFA (cdr l) state VT)
                (if (not (member (car l) VT))
                    "Терминал не принадлежит алфавиту языка"
                    "ДКА не пришел в конечное состояние")))))
 
(DFA '(a a a b c))   ==> "ДКА пришел в конечное состояние"
(DFA '(a a a c c))   ==> "ДКА не пришел в конечное состояние"
(DFA '(a e a b c))   ==> "Терминал не принадлежит алфавиту языка"
(DFA '(a a a b c e)) ==> "Терминал не принадлежит алфавиту языка"

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

Код представляет собой реализацию простого конечного автомата (DFA) на языке Lisp. Программа определяет функцию DFA, которая принимает на вход список символов l, начальное состояние state и множество допустимых символов VT. Если входной список l пуст, и состояние равно q2, то выводится сообщение ДКА пришел в конечное состояние. Если состояние равно q0, то выполняется следующее:

  1. Если первый символ списка равен 'a, то вызывается функция DFA для списка, состоящего из всех символов, кроме первого, с новым состоянием 'q1 и VT.
  2. Если первый символ списка равен 'b, то вызывается функция DFA для списка, состоящего из всех символов, кроме первого, с новым состоянием 'q1 и VT.
  3. Если первый символ списка не равен 'a и 'b, и этот символ не принадлежит множеству VT, то выводится сообщение Терминал не принадлежит алфавиту языка. Если условие не выполняется, то вызывается функция DFA для списка, состоящего из всех символов, кроме первого, с новым состоянием 'q1 и VT. Если состояние равно q1, то выполняется следующее:
  4. Если первый символ списка равен 'b, то вызывается функция DFA для списка, состоящего из всех символов, кроме первого, с новым состоянием 'q2 и VT.
  5. Если первый символ списка равен 'c, то вызывается функция DFA для списка, состоящего из всех символов, кроме первого, с новым состоянием 'q2 и VT.
  6. Если первый символ списка не равен 'a и 'b, и этот символ не принадлежит множеству VT, то выводится сообщение Терминал не принадлежит алфавиту языка. Если условие не выполняется, то вызывается функция DFA для списка, состоящего из всех символов, кроме первого, с новым состоянием 'q2 и VT. Если состояние не равно q0 и q1, и первый символ списка равен 'c, то вызывается функция DFA для списка, состоящего из всех символов, кроме первого, с новым состоянием 'q2 и VT. Если условие не выполняется, то выводится сообщение Терминал не принадлежит алфавиту языка. Если первый символ списка не равен 'c, и этот символ не принадлежит множеству VT, то выводится сообщение Терминал не принадлежит алфавиту языка. Если оба условия не выполняются, то вызывается функция DFA для списка, состоящего из всех символов, кроме первого, с новым состоянием 'q2 и VT. Пример использования функции DFA: (DFA '(a a a b c)) ==> ДКА пришел в конечное состояние (DFA '(a a a c c)) ==> ДКА не пришел в конечное состояние (DFA '(a e a b c)) ==> Терминал не принадлежит алфавиту языка (DFA '(a a a b c e)) ==> Терминал не принадлежит алфавиту языка

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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