Написать функцию с двумя переменными. Первая - собственно, шаблон, вторая - строка для проверки соответствия - Lisp
Формулировка задачи:
Задание: сопоставление введенного шаблона и строки
Нужно написать функцию с двумя переменными. первая - собственно, шаблон, вторая - строка для проверки соответствия.
Шаблон строится по следующим правилам:
символ * заменят любой символ в количестве от 0 до n
символ ? заменят только один любой символ
количество * и ? в шаблоне неограничено
Например, при введенном шаблоне L?*S**P строка LISP будет ему соответствовать
Пожалуйста, если есть идеи, подскажите!
Решение задачи: «Написать функцию с двумя переменными. Первая - собственно, шаблон, вторая - строка для проверки соответствия»
textual
Листинг программы
(defun mems (s p) (member (car s) (cdr p) :test #'equal)) (defun check (p s) (cond ((null s) t) ((or (equal (car p) (car s)) (equal (car p) "?")) (check (cdr p) (cdr s))) ((when (equal (car p) "*") (if (mems s p) (if (equal (car s) (cadr s)) (check (cdr (mems s p)) (cddr s)) (check (cdr (mems s p)) (cdr s))) (check p (cdr s))))))) (defun squeeze (p &optional z) (when p (if (equal (car p) "*") (if z (squeeze (cdr p) z) (cons "*" (squeeze (cdr p) t))) (cons (car p) (squeeze (cdr p) nil))))) (defun cleave (s) (map 'list #'string s)) (defun concord (p s) (when (> (length s) 0) (check (squeeze (cleave p)) (cleave s)))) > (concord "L?*S**P" "LISP") T > (concord "L?*S**P" "LCISP") T > (concord "L?*S**P" "LISRP") T > (concord "L?*S**P" "LLISP") T > (concord "L?*S**P" "LISPP") T > (concord "L?*S**P" "CLISP") NIL > (concord "L?*S**P" "LISPC") NIL > (concord "L?*S**P" "") NIL
Объяснение кода листинга программы
В этом коде представлено несколько функций для работы со строками в языке программирования, возможно, Lisp. Они выполняют следующие действия:
- Функция
mems
ищет все вхождения первого аргумента (шаблона) во втором аргументе (строке для проверки). - Функция
check
проверяет, соответствует ли первый аргумент (шаблон) второму аргументу (строке для проверки). Если шаблон равен*
, то функция рекурсивно вызывается для оставшейся части строки. Если шаблон равен?
, то функция возвращаетnil
. Если шаблон равен*
, то функция проверяет, содержит ли строка символ?
. Если да, то функция возвращаетnil
. Если нет, то функция вызывается рекурсивно для оставшейся части строки. Если шаблон равен пустой строке, то функция возвращаетnil
. - Функция
squeeze
удаляет все вхождения символа*
из строки. Если второй аргумент (опциональный) равенnil
, то возвращается исходная строка без изменений. Если второй аргумент (опциональный) не равенnil
, то он добавляется в начало результата. - Функция
cleave
разбивает строку на список символов. - Функция
concord
проверяет, соответствует ли первый аргумент (шаблон) второму аргументу (строке для проверки). Если шаблон равен*
, то функция вызывается рекурсивно для оставшейся части строки. Если шаблон равен?
, то функция возвращаетnil
. Если шаблон равен*
, то функция проверяет, содержит ли строка символ?
. Если да, то функция возвращаетnil
. Если нет, то функция вызывается рекурсивно для оставшейся части строки. Если шаблон равен пустой строке, то функция возвращаетnil
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д