Работа со словами в форме списков - Lisp

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

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

Определить с помощью упоминаемого в тексте теоретического раздела (п.5.3) предиката РАНЬШЕ-Р предикат (АЛФАВИТ-Р х у), определяющий стоят ли слова, заданные списком букв, в алфавитном(словарном) порядке. После этого определить функцию (СЛОВАРЬ х), которая сортирует в алфавитном порядке неупорядоченное множество слов. Например,
Листинг программы
  1. >(словарь '((Ф у н к ц и я) (цикл) (р е к у р с и я)))
  2. (Р Е К У Р С И Я) (Ф У Н К Ц И Я) (Ц И К Л))
Определить с их помощью функцию, составляющую из данных слов обратный словарь, т.е. перечень слов, который упорядочен по буквам, начиная от конца слова к его началу. Например:
Листинг программы
  1. >(словарь '((Ф у н к ц и я) (цикл) (р е к у р с и я)))
  2. ((Ц И К Л) (Р Е К У Р С И Я) (Ф У Н К Ц И Я))
Предикат РАНЬШЕ-Р проверяет, находится ли элемент А ранее элемента В, в соответствии с расположением, определенным порядком следования элементов в списке ПОРЯДОК:
Листинг программы
  1. >(defun РАНЬШЕ-Р b порядок)
  2. (cond ((null порядок) nil)
  3. ((eq a (car порядок)) t) раньше
  4. ((eq b (car порядок)) nil) раньше
  5. (t (РАНЬШЕ-Р a b (cdr порядок)))))
  6. РАНЬШЕ-Р
  7. >(раньше-р 'b 'e '(a b с d е))
  8. Т
  9. >(вставь 'b '(а с d) '(a b с d e))
  10. В С D)

Решение задачи: «Работа со словами в форме списков»

textual
Листинг программы
  1. (defun раньше-р (a b порядок)
  2.   (COND ((NULL порядок) NIL)
  3.         ((EQ a (CAR порядок)) T)
  4.         ((EQ b (CAR порядок)) NIL)
  5.         (T (РАНЬШЕ-Р a b (CDR порядок)))))
  6.  
  7. (defun cmp-words (w1 w2 seq &optional (ww1 w1) (ww2 w2))
  8.   (cond ((and (null w1) (null w2)) ww1)
  9.         ((and (null w1) w2) ww1)
  10.         ((and (null w2) w1) ww2)
  11.         ((eq (car w1) (car w2)) (cmp-words (cdr w1) (cdr w2) seq ww1 ww2))
  12.         ((РАНЬШЕ-Р (car w1) (car w2) seq) ww1)
  13.         (t ww2)))
  14.  
  15. (defun min-word (wlist seq &optional (minw (car wlist)))
  16.   (cond ((null wlist) minw)
  17.         (t (min-word (cdr wlist) seq (cmp-words (car wlist) minw seq)))))
  18.  
  19.  
  20. (defun sort-words (wlist seq)
  21.   (cond ((null wlist) nil)
  22.         (t (let ((minw (min-word wlist seq)))
  23.            (cons minw (sort-words (removef minw wlist) seq))))))
  24.  
  25. (sort-words '((b o t) (b a t t) (a 1) (a 0))  '(0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z))
  26.  
  27. ==> ((a 0) (a 1) (b a T T) (b o T))

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

В коде представлено несколько функций для работы со словами в форме списков на языке Lisp.

  1. ранее-р — функция, принимающая три аргумента: a, b и порядок. Если порядок — это пустой список, то возвращается NIL. Если первый элемент порядка равен a, то возвращается T. Если первый элемент порядка равен b, то возвращается NIL. В противном случае функция рекурсивно вызывается с CDR порядка в качестве нового порядка.
  2. cmp-words — функция, принимающая пять аргументов: w1, w2, seq и два необязательных аргумента ww1 и ww2. Если w1 и w2 оба NULL, то возвращается ww1. Если w1 NULL, а w2 нет, то возвращается ww2. Если первый элемент w1 равен первому элементу w2, то функция рекурсивно вызывается с CDR w1 и CDR w2 в качестве новых значений w1 и w2. Если первый элемент w1 идет перед первым элементом w2 в seq, то возвращается ww1. В противном случае возвращается ww2.
  3. min-word — функция, принимающая четыре аргумента: wlist, seq и два необязательных аргумента minw и ww1. Если wlist NULL, то возвращается minw. Если wlist не NULL, то функция рекурсивно вызывается с CDR wlist и seq в качестве новых значений wlist и seq, а minw передается как minw в следующую итерацию.
  4. sort-words — функция, принимающая два аргумента: wlist и seq. Если wlist NULL, то возвращается NIL. Если wlist не NULL, то функция рекурсивно вызывается с CDR wlist и seq в качестве новых значений wlist и seq, а minw передается как minw в следующую итерацию. В основной части кода вызывается функция sort-words с аргументами '((b o t) (b a t t) (a 1) (a 0)) и '0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z'. Функция sort-words рекурсивно вызывается для каждого элемента в wlist. В этом процессе min-word используется для определения текущего минимального элемента, а cmp-words используется для определения порядка элементов. В конце функция возвращает отсортированный список. В результате выполнения кода будет возвращен отсортированный список: ((a 0) (a 1) (b a T T) (b o T)).

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


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

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

6   голосов , оценка 3.833 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут