Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 05.12.2016
Сообщений: 7

Сократить s-выражение(точечная пара)

16.12.2017, 21:17. Показов 1657. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задание выглядит так:
Сократить следующие S-выражения:
Lisp
1
2
3
4
((А.(B.NIL)).((C.(D.NIL)).NIL))
(((A.NIL).NIL).B)
((A B C.(D E F.NIL))
((A.B).(C.D))
Алгоритм сокращения представляет из себя 2 пункта:
1.Цепочки . Nil просто удаляем;
2. Цепочки . ( удаляем вместе с соответствующей закрывающей скобкой

Но у меня получилось реализовать только удаление NIL. Вот код:
Lisp
1
2
3
4
5
6
(defun elimina (l &optional l0)
  (cond ((null l) (reverse l0))
        ((eq nil (car l)) (elimina (cdr l) l0))
        (T (elimina (cdr l) (cons (if (not (atom (car l))) 
                                        (elimina (car l)) 
                                        (car l)) l0))))
Lisp
1
2
> ((elimina '((A . (B . NIL)) . ((C . (D . NIL)) . NIL)))
((A B) (C D))
Как доделать программу? А вернее как реализовать работу с точечными парами?
Заранее спасибо за ответы.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.12.2017, 21:17
Ответы с готовыми решениями:

Точечная пара
Функция должна возвращать точечную пару минимального и максимального чисел Проверка на вложенность Если символы то пропускает

Произведение целых чисел из списка(точечная пара)
Задать рекурсивную функцию int_prod(x), которая вычисляет произведение целых чисел из списка. Пыталась реализовать функцию. Она...

Сократить выражение
Здравствуйте Фрагмент кода: Sum-=(c=Sum/25)*25; coins+=c; Sum-=(c=Sum/10)*10; coins+=c; ...

9
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
16.12.2017, 21:56
Я бы, может, подсказал бы, но здесь
Цитата Сообщение от nastasyamis Посмотреть сообщение
1.Цепочки . Nil просто удаляем;
2. Цепочки . ( удаляем вместе с соответствующей закрывающей скобкой
не понял ничего. Какие цепочки? Какие скобки?
0
0 / 0 / 0
Регистрация: 05.12.2016
Сообщений: 7
16.12.2017, 22:19  [ТС]
На самом деле я не уверена на счет правильности алгоритма, но я предполагаю, что это должно выглядеть примерно так:
Миниатюры
Сократить s-выражение(точечная пара)  
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
17.12.2017, 00:18
А, что-то понял. Некоторая проблема в том, что в лисповом ридере это уже сделано и работает из коробки. Поэтому если вы передадите вашей (или любой другой) функции аргумент (a . (b . nil)), а в другой раз — (a b), она не заметит разницы. Не понимаю поэтому, на каком уровне вам надо работать. Может, на уровне потоков?

Добавлено через 15 минут
То есть я, в частности, хочу сказать, что если вы в репле напишете '(a . (b . (c . nil))), то в ответ он напишет вам, по всей вероятности, (A B C) — тот же список, другая форма записи.
2
0 / 0 / 0
Регистрация: 05.12.2016
Сообщений: 7
17.12.2017, 00:43  [ТС]
Цитата Сообщение от helter Посмотреть сообщение
А, что-то понял. Некоторая проблема в том, что в лисповом ридере это уже сделано и работает из коробки. Поэтому если вы передадите вашей (или любой другой) функции аргумент (a . (b . nil)), а в другой раз — (a b), она не заметит разницы. Не понимаю поэтому, на каком уровне вам надо работать. Может, на уровне потоков?

Добавлено через 15 минут
То есть я, в частности, хочу сказать, что если вы в репле напишете '(a . (b . (c . nil))), то в ответ он напишет вам, по всей вероятности, (A B C) — тот же список, другая форма записи.
Т.е. получается я неправильно понимаю суть задания и ничего сокращать не надо.
И если просто так сделать Lisp просто сам все сократит что-ли?

Lisp
1
2
3
4
5
6
> (defun func (x)                  
  (if (list x) x))                   
FUNC   
                            
> (func '(((A . NIL) . NIL) . B))  
(((A)) . B)
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
17.12.2017, 01:01
Не знаю. Формально, атомы тоже являются s-выражениями. То есть не надо делать ровным счётом ничего.

Вот, я запускаю лисп, ввожу ваш список, и что вижу:
Lisp
1
2
CL-USER> '(((A . NIL) . NIL) . B)
(((A)) . B)
S-выражения не лисповые объекты. Это форма записи. Разница — как звуки и буквы, числа и цифры. Можно записать S-выражение в файл, можно забить в репл. Лисп это читает. Когда читает, он что-то делает внутри — память выделяет, что-нибудь с указателями, то-сё — не знаю, что он там делает. Но факт, что когда он прочитал и создал объект, он уже не помнит, были там точки или нет. Вы напишете (1 . nil) и (1), и создадутся списки совершенно одинаковой структуры, которые не будут знать, что текстовое представление у них было разное.

А лисповые функции работают с лисповыми объектами.

Поэтому получается, что если вы хотите, чтобы ваша функция работала с формой записи, как с объектом, вам надо давать ей не распаршенный ридером список, а что-то сырое. Например, поток ввода. Или там, какой-нибудь лексер будет разбивать поток ввода на токены, и ваша функция будет принимать эти токены. Но по вашей формулировке догадаться невозможно.

Добавлено через 4 минуты
Меня вдруг осенило.

А может, предполагается, что вы не функцию будете писать, а сами вручную сделаете? Типа проверки, что вы поняли, как читает лисп, и что можете работать компьютером. Тогда забейте в лисп и перепишите ответы.
1
0 / 0 / 0
Регистрация: 05.12.2016
Сообщений: 7
17.12.2017, 01:18  [ТС]
Спасибо за столь подробное объяснение.

Да это вариант вводить в ручную, но не знаю в какой форме это сдавать.
Так может сделать функцию с проверкой на атом и на список?
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
17.12.2017, 01:29
Я говорю — не вводить вручную, а считать вручную. Берёте лист бумаги, пишете: задание 1: такое-то. Решение. ... Ответ: ... . Но это только предположение, я же не ясновидец.

Атомы и списки — тоже уже лисповые объекты, а не формы записи.
0
 Аватар для _sg
4710 / 4405 / 380
Регистрация: 12.05.2012
Сообщений: 3,102
17.12.2017, 08:53
Lisp
1
2
CL-USER> '((A . (B . NIL)) . ((C . (D . NIL)) . NIL))
((A B) (C D))
Добавлено через 1 минуту
Lisp
1
2
CL-USER> '(((A . NIL) . NIL) . B)
(((A)) . B)
Добавлено через 1 минуту
Lisp
1
2
CL-USER> '((A B C . (D E F . NIL)))
((A B C D E F))
Добавлено через 53 секунды
Lisp
1
2
CL-USER> '((A . B) . (C . D))
((A . B) C . D)
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38190 / 21125 / 4307
Регистрация: 12.02.2012
Сообщений: 34,732
Записей в блоге: 14
17.12.2017, 11:42
Лучший ответ Сообщение было отмечено _sg как решение

Решение

Вот как это нужно понимать:

Lisp
1
2
((А . (B . NIL)) . ((C . (D . NIL)) . NIL)) -> ((A . (B)) . ((C . (D))))) ;; правило 1
((A . (B)) . ((C . (D))))) ->  ((A B) (C D))) ;; правило 2
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.12.2017, 11:42
Помогаю со студенческими работами здесь

Сократить выражение
\bar{\bar{A|\bar{B}} \leftrightarrow BC \rightarrow AB\bar{C}} \bar{A|\bar{B}} = \bar{\bar{C} OR B} правильно ли преобразовал?

Сократить выражение
Как сократить такое выражение? <?php if($_GET == 'apie-studijas') { ?> <?php } elseif($_GET == 'kontaktai') { ?> ...

Сократить выражение
Как сокращаются эти выражения? в книге написали, что это обычная формула. но непонятно как они реализованы пошагово. A\bar{B}+B \equiv...

Сократить логическое выражение
помогите сократить только последовательно пожалуйста A → (¬A ▽ ¬B)

Как сократить такое выражение?
syms w i


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru