Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Lisp
Перезагрузить страницу Сравнение многоуровневых списков
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
SergeP SergeP вне форума
Новичок
 
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 05.02.2010
По умолчанию 05.02.2010, 18:45

Уважаемые Знатоки ! Не составит ли вам труда поделиться текстом функции, которая сравнивает на эквивалентность многоуровневые списки.

Заранее брагодарен

Ответить с цитированием
  (#2 (permalink)) Старый
VH VH вне форума
Member
 
Сообщений: 781
Сказал(а) спасибо: 0
Поблагодарили 11 раз(а) в 10 сообщениях
Регистрация: 29.06.2006
По умолчанию 05.02.2010, 19:03

XLISP-PLUS version 3.04
Portions Copyright © 1988, by David Betz.
Modified by Thomas Almy and others.
> (setq L1 '(1 (2 (3))))
(1 (2 (3)))
> (setq L2 '(1 (2 (3))))
(1 (2 (3)))
> (equal L1 L2)
T
Соответственно:
Код:
(defun F (L1 L2)
 (equal L1 L2))
Ответить с цитированием
  (#3 (permalink)) Старый
SergeP SergeP вне форума
Новичок
 
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 05.02.2010
По умолчанию 05.02.2010, 20:31

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

(1 2 3 4) и (3 2 1 4) -- NIL
(1,2,3,4) <> (3,2,1,4)

((set) 1 2 3 4) и ((set) 3 2 1 4) -- T
{1,2,3,4} = {3,2,1,4}

(2 3 ((set) 1 4)) и (2 ((set) 4 1) 3) -- NIL
(2,3,{1,4}) <> (2,{4,1},3)

((set) 2 3 (1 4)) и ((set) 2 (4 1) 3) -- NIL
{2,3,(1,4)} <> {2,(4,1),3}

(2 3 ((set) 1 4)) и (2 3 ((set) 4 1)) -- T
(2,3,{1,4}) = (2,3,{4,1})

((set) 2 3 ((set) 1 4)) и ((set) 2 ((set) 4 1) 3) -- T
{2,3,{1,4}} = {2, {4,1}, 3}

Ответить с цитированием
  (#4 (permalink)) Старый
SergeP SergeP вне форума
Новичок
 
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 05.02.2010
По умолчанию 08.02.2010, 17:42

Уважаемый VH,

Не созрела ли у Вас идея, как реализовать подобную логику сравнения множеств и списков? Ответьте, бд.,спасибо
Ответить с цитированием
  (#5 (permalink)) Старый
korvin korvin вне форума
Member
 
Аватар для korvin
 
Сообщений: 337
Сказал(а) спасибо: 1
Поблагодарили 15 раз(а) в 15 сообщениях
Регистрация: 25.01.2010
По умолчанию 09.02.2010, 23:08

Цитата:
Уважаемый VH,

Не созрела ли у Вас идея, как реализовать подобную логику сравнения множеств и списков? Ответьте, бд.,спасибо
у меня есть идея: используйте в качестве внутреннего представления множества хеш-таблицу и equalp в качестве предиката сравнения

например так:
Код:
(defun make-set (&rest args)
  (let ((s (make-hash-table :test 'equal)))
    (dolist (a args s)
      (setf (gethash a s) t))))

(defun set->list (s)
  (let ((l nil))
    (maphash #'(lambda (key val)
                 (declare (ignore val))
                 (push key l))
             s)
    l))

;;; Testing:

CL-USER> (equalp '(1 2 3 4) '(3 2 1 4))
NIL                                                                                                                 
CL-USER> (equalp (make-set 1 2 3 4)                                                                                 
                 (make-set 3 2 1 4))
T                                                                                                                   
CL-USER> (equalp (list 2 3 (make-set 1 4))                                                                          
                 (list 2 (make-set 4 1) 3))
NIL                                                                                                                 
CL-USER> (equalp (make-set 2 3 '(1 4))                                                                              
                 (make-set 2 '(4 1) 3))
NIL                                                                                                                 
CL-USER> (equalp (list 2 3 (make-set 1 4))                                                                          
                 (list 2 3 (make-set 4 1)))
T                                                                                                                   
CL-USER> (equalp (make-set 2 3 (make-set 1 4))                                                                      
                 (make-set 2 (make-set 4 1) 3))
T                                                                                                                   
CL-USER>
только одно замечание: поскольку каждое из множеств {2, 3, {1, 4}} и {2, {4, 1}, 3} фактически является множеством {1, 2, 3, 4}, то неплохо бы реализовать make-set таким образом, чтобы "внутренние" множества объединялись с "внешним" и на выходе получалась одна хеш-таблица, а не несколько вложенных. есть несколько способов это сделать =)
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
Alexey Dejneka Alexey Dejneka вне форума
Member
 
Сообщений: 451
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.11.2004
По умолчанию 10.02.2010, 07:33

Цитата:
только одно замечание: поскольку каждое из множеств {2, 3, {1, 4}} и {2, {4, 1}, 3} фактически является множеством {1, 2, 3, 4}
С какой стати?! Множество уже не может быть элементом другого множества?
Ответить с цитированием
  (#7 (permalink)) Старый
korvin korvin вне форума
Member
 
Аватар для korvin
 
Сообщений: 337
Сказал(а) спасибо: 1
Поблагодарили 15 раз(а) в 15 сообщениях
Регистрация: 25.01.2010
По умолчанию 13.02.2010, 18:38

Цитата:
С какой стати?! Множество уже не может быть элементом другого множества?
да, действительно может. извиняюсь, ляпнул неподумав. хотя для меня это все равно странно =)
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнение списков Alda Lisp 5 13.01.2012 12:59
Сравнение двух списков zener Prolog 4 28.10.2010 15:40
Обработка списков Svoboda Prolog 8 28.06.2010 12:05
сравнение списков в прологе pasha51113 Prolog 5 28.04.2010 21:44
Сравнить два многоуровневых списка,вывести их общие элементы Eugeneminimal Lisp 3 16.02.2010 22:38
Внутренняя база данных на многоуровневых составных доменах со списками. BuuuGGi Prolog 1 01.11.2009 20:05
Обработка списков Ranika Prolog 0 26.04.2009 01:58
Сравнение списков z556 Prolog 6 15.04.2009 21:00
Слияние списков sprew88 Prolog 5 20.12.2007 18:23
Сравнение двух списков по элементно(с условием ...) degavi Prolog 15 19.12.2005 14:26
О многоуровневых макросах kminas Visual Basic 1 20.11.2005 17:24
Пересечение списков linux Prolog 1 21.12.2004 12:09



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов