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

Определить функцию предикатного типа, которая определяет, что два S-выражения эквивалентны

22.09.2017, 10:32. Показов 1361. Ответов 14

Author24 — интернет-сервис помощи студентам
Нужна помощь "определить функцию предикатного типа которая определяет, два S-выражения эквивалентны". Можна использовать только базовые функции: define, lambda, cdr, car, pair?, list?, quote, eq? , eqv?, equal?, cond, cons и рекурсию.
Буду очень благодарен за помощь.

Добавлено через 35 минут
Можна использовать только базовые функции: define, lambda, cdr, car, pair?, list?, quote, eq? , eqv?, cond, cons и рекурсию.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.09.2017, 10:32
Ответы с готовыми решениями:

Описать логическую функцию, которая определяет, имеет ли файл f типа FR нечетную длину
плиз, помогите написать программу на паскале type FR=file of real; Описать логическую...

Описать логическую функцию mid(f) которая определяет, имеет ли файл f Типа FR четную длину
Задание: Описать логическую функцию mid(f) которая определяет, имеет ли файл f Типа FR четную...

Написать функцию kvadr с переменным числом параметров, которая определяет количество чисел, являющихся точными квадратами (2, 4, 9, 16,. . . ) типа in
Написать функцию kvadr с переменным числом параметров, которая определяет количество чисел,...

Написать функцию,которая определяет, верно ли что последняя цифры в числе 5
Написать функцию,которая определяет, верно ли что последняя цифры в числе 5

14
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
22.09.2017, 12:36 2
Вы сами будете писать или нет? Если да, поясните, что такое «S-выражения эквивалентны».
0
0 / 0 / 0
Регистрация: 11.05.2016
Сообщений: 7
22.09.2017, 13:13  [ТС] 3
Я написал код но он явно не правильный, S-выражения эквивалентны это значит что атомы, пары списки и т.п. (сделать сравнение например 2 списков если одинаковые то #t если нет то #f)
Ну и вот код мой
Lisp
1
2
3
4
5
6
7
8
(define myf(lambda (list list2)
             (cons
          ((myf`(car list)`(car list)))
             ((eq? (car list)(car list2))#t)
             ((myf (cdr list)(cdr list2)))
              (#f #f))))
 
(myf `(a b c)`(a b c))
0
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
22.09.2017, 13:30 4
Цитата Сообщение от LordNightWolf Посмотреть сообщение
значит что атомы, пары списки и т.п.
Что атомы, пары списки — что? (Интересно, что это — списка.)

А словами можете написать алгоритм, который реализуете?
0
0 / 0 / 0
Регистрация: 11.05.2016
Сообщений: 7
22.09.2017, 15:56  [ТС] 5
S-выражения могут быть как отдельными объектами (атомами), такими как числа, Символ, включая специальные символы nil и t, или точечными парами в виде (x . y). Более длинные списки, состоящие из вложенных точечных пар, например (1 . (2 . (3 . nil))), можно написать более привычным способом, как (1 2 3). Вложенные списки также могут быть записаны в виде S-выражений: ((молоко сок) (мёд мармелад)). S-выражения не зависят от пробелов и разрывов строк, пробелы используются только в качестве разграничителей между атомами.


Нужно чтобы каждый элемент проверяло между собой и выводило true если они одинаковые, если нет тогда false. Иными словами eq? это #t а все остальное это false. Например (a b c) (a b d) выходит что тут у нас будет false

Добавлено через 2 часа 12 минут
Вот и код:

Lisp
1
2
3
4
(define mys (lambda (a b)
             (cond
                ((eq? b `())0)
                (#t(equal? (cdr a)(cdr b))))))
Тема закрыта
0
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
22.09.2017, 16:26 6
Цитата Сообщение от LordNightWolf Посмотреть сообщение
S-выражения могут быть
Я знаю, что такое S-выражение. Вы не видите, у вас не хватает глагола?
Цитата Сообщение от LordNightWolf Посмотреть сообщение
это значит что атомы, пары списки и т.п
Что атомы должны?

Цитата Сообщение от LordNightWolf Посмотреть сообщение
Вот и код:
Подозреваю, что вы хотите написать свою версию equal? В таком случае использовать саму эту функцию неспортивно. Вероятно, в этом месте должна быть рекурсия.

А вас не смущает, что вы просто отбрасываете car-ы и не сравниваете их?
0
0 / 0 / 0
Регистрация: 11.05.2016
Сообщений: 7
22.09.2017, 16:46  [ТС] 7
Да хочу сделать свой "equal?"
Я только второй день работаю из Scheme. Потому попросил помощи.
0
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
22.09.2017, 16:48 8
Цитата Сообщение от LordNightWolf Посмотреть сообщение
Потому попросил помощи.
Пишите по-русски, сказуемые не забывайте.

Код ваш неправильный. Так вы напишете словами алгоритм?
0
0 / 0 / 0
Регистрация: 11.05.2016
Сообщений: 7
22.09.2017, 17:00  [ТС] 9
1. Задаем определенные цифры или буквы
2. Перебираем сначала все первые элементы (car)
3. Перебираем все остальные элементы (cdr)
4. Сравниваем их между собой (eq?)
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,644
Записей в блоге: 13
22.09.2017, 18:53 10
Лучший ответ Сообщение было отмечено LordNightWolf как решение

Решение

Lisp
1
2
3
4
5
6
7
(define comp-exps
 (lambda (x1 x2)
  (cond ((or (atom? x1) (atom? x2)) (eq? x1 x2))
        (#t (and (comp-exps (car x1) (car x2))
                 (comp-exps (cdr x1) (cdr x2)))))))  
                
(display (comp-exps '(1 (2 3)) '(1 (2 3))))
см. на ideone
2
0 / 0 / 0
Регистрация: 11.05.2016
Сообщений: 7
22.09.2017, 19:03  [ТС] 11
Огромное спасибо вам))
0
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
22.09.2017, 19:49 12
Гм. Ну хотя бы ветку else надо бы предварить символом else, в схеме так делают.
1
4699 / 4394 / 380
Регистрация: 12.05.2012
Сообщений: 3,096
23.09.2017, 16:22 13
вариант Common Lisp:
Lisp
1
2
3
4
5
6
7
8
9
(defun comp-exps (w v)
  (if (atom w) (eq w v) 
      (and (comp-exps (car w) (car v))
           (comp-exps (cdr w) (cdr v)))))
 
> (comp-exps '(1 (2 3)) '(1 (2 3)))
T
> (comp-exps '(1 (2 3)) '(1 (2 2)))
NIL
1
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
24.09.2017, 01:45 14
Цитата Сообщение от LordNightWolf Посмотреть сообщение
4. Сравниваем их между собой (eq?)
может очень плохо кончиться
1
0 / 0 / 0
Регистрация: 11.05.2016
Сообщений: 7
07.10.2017, 13:49  [ТС] 15
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
(define atom? (lambda (x) (cond ((pair? x) #f) ((list? x) #f) (#t #t))))
(define and? (lambda (x y) (cond ((eq? x #f) #f) ((eq? y #f) #f) (#t #t))))
(define or? (lambda (x y) (cond (x #t) (y #t) (#t #f))))
(define not? (lambda (x) (cond (x #f)(#t #t))))
 
(define equals? (lambda (x y)(cond
  ((eq? x y) #t)
  ((or? (eq? x '()) (eq? y '())) #f)
  ((or? (atom? x) (atom? y)) #f)
 
  ((and? (and? (pair? x) (pair? y)) (and? (pair? (car x)) (eq? (cdr x) '()))) (equals? (car x) y))
  ((and? (and? (pair? x) (pair? y)) (and? (pair? (car y)) (eq? (cdr y) '()))) (equals? x (car y)))
  ((not? (equals? (car x) (car y))) #f)
  (#t (equals? (cdr x) (cdr y))))))
 
(equals? `(1  2)`(1 . (2)))
(equals? `(1)`(2))
 
(equals? `(1  2)`(1 . (2))) ;; тут говорит что #t а должно писать #f.  Все остальные проверки работают
0
07.10.2017, 13:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.10.2017, 13:49
Помогаю со студенческими работами здесь

Напишите перегруженную функцию power (), которая принимает два целочисленных параметра типа int и возвращает целочисленное значение типа int
Операции над целыми числами осуществляются быстрее, чем над числами с плавающей точкой. Напишите...

Файлы. Программа, которая определяет если такой момент, что два раза вошли по одному пропуску или два раза вышли по одному (выводит все время истину)
Всем привет. Смысл задания примерно следующий: Есть файл Input.txt. Содержание его примерное...

Составить функцию, которая определяет, верно ли, что в заданном числе все цифры стоят по возрастанию
Составить функцию, которая определяет, верно ли, что в заданном числе все цифры стоят по...

Написать функцию, которая принимает два параметра типа unsignet short int
Здравствуйте. Начал изучать С++ и столкнулся с таким заданием. Не могу разобраться и путаюсь в...


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

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