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

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

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

Author24 — интернет-сервис помощи студентам
Задание выглядит так:
Сократить следующие 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.12.2017, 21:17
Ответы с готовыми решениями:

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

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

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

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

9
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
16.12.2017, 21:56 2
Я бы, может, подсказал бы, но здесь
Цитата Сообщение от nastasyamis Посмотреть сообщение
1.Цепочки . Nil просто удаляем;
2. Цепочки . ( удаляем вместе с соответствующей закрывающей скобкой
не понял ничего. Какие цепочки? Какие скобки?
0
0 / 0 / 0
Регистрация: 05.12.2016
Сообщений: 7
16.12.2017, 22:19  [ТС] 3
На самом деле я не уверена на счет правильности алгоритма, но я предполагаю, что это должно выглядеть примерно так:
Миниатюры
Сократить s-выражение(точечная пара)  
0
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
17.12.2017, 00:18 4
А, что-то понял. Некоторая проблема в том, что в лисповом ридере это уже сделано и работает из коробки. Поэтому если вы передадите вашей (или любой другой) функции аргумент (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  [ТС] 5
Цитата Сообщение от 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
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
17.12.2017, 01:01 6
Не знаю. Формально, атомы тоже являются 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  [ТС] 7
Спасибо за столь подробное объяснение.

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

Атомы и списки — тоже уже лисповые объекты, а не формы записи.
0
4699 / 4394 / 380
Регистрация: 12.05.2012
Сообщений: 3,096
17.12.2017, 08:53 9
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
36606 / 20334 / 4221
Регистрация: 12.02.2012
Сообщений: 33,651
Записей в блоге: 13
17.12.2017, 11:42 10
Лучший ответ Сообщение было отмечено _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
17.12.2017, 11:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.12.2017, 11:42
Помогаю со студенческими работами здесь

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

Сократить выражение
Как сокращаются эти выражения? в книге написали, что это обычная формула. но непонятно как они...

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

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru