DFA in Scheme (домашнее задание) - PullRequest
0 голосов
/ 11 ноября 2018

Работа над домашним заданием с просьбой написать DFA-акцептор в Схеме. Алфавит: {0, 1} Начальное состояние: {Q0} Конечное состояние: {Q2}. Строка должна иметь 01 в последовательности, которая будет принята. Состояния: Q0 on 1 переходит в Q1. Q0 на 0 переходит в Q0. Q1 on 1 переходит в Q2. Q1 на 0 переходит в P. Q2 на 0 и 1 переходит на Q1. Учитель запросил, чтобы каждое состояние было функцией и возвращало функцию, в которую оно переходит. (Q0 1) возвращает Q1 и т. Д. Приведенный ниже код является попыткой запустить программу, прежде чем беспокоиться о проверке, находится ли 01 в строке. В настоящее время получаю сообщение об ошибке: «Q0: несвязанный идентификатор;» и я не уверен, почему после некоторого поиска. Любые указатели будут полезны. Вопрос для домашней работы, поэтому не ищите прямых ответов. Спасибо!

#lang racket
(define DFA-trans '((Q0 x) (Q1 x) '((Q2 x)) (P x)))

(define x '(1 1 0 1 0))

(define P(null? 1))

(define Q2 (lambda(x)
         (if (null? (car x))
             #t
         (if (equal? (car x) 0)
             (Q2 (cdr x))
         (if (equal? (car x) 1)
             (Q2 (cdr x))
             #t
             )))))

(define Q1 (lambda(x)
         (if (null? (car x))
             #f
         (if (equal? (car x) 0)
             (P (cdr x))
         (if (equal? (car x) 1)
             (Q2 (cdr x))
             #f
             )))))

(define Q0 (lambda(x)
         (if (null? (car x))
             #f
         (if (equal? (car x) 0)
             (Q0 (cdr x))
         (if (equal? (car x) 1)
             (Q1 (cdr x))
             #f
             )))))

(define DFA(map eval DFA-trans))
(DFA)

1 Ответ

0 голосов
/ 25 апреля 2019

Не используйте EVAL для этого.

Определения P, Q0, Q1, Q2 выглядят хорошо.

Если мы можем определить DFA напрямую, вы можете просто удалить DFA-trans.

Предполагая, что Q0 является начальным состоянием, я думаю, вы можете просто сделать это

(define DFA (lambda () (Q0 x)))

И рассмотрите возможность использования COND вместо вложенного IF.

...