Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > LISP > Списки


Автор: yarus88 29.3.2009, 19:11
1) Нужно написать функцию, возвращающую Т,если одинаковые атомы расположены в списках х и у в одном и том же порядке.

2) Написать функцию аргументов L1 и L2, возвращающую Т, если L1 является подсписком L2. Элементами списков могут быть атомы и списки любой глубины вложенности.

Автор: VH_ 7.4.2009, 09:49
1) «...если одинаковые атомы расположены...»:
вариант теоретический
Код
(defun F (set1 set2)
  ((lambda (intersect)
    (if intersect
     ((lambda (fdef)
       (fdef fdef set2 intersect))
      (lambda (fname s i)
       (if (null i) T
        ((lambda (found)
          (if found
           (fname fname (cdr found) (cdr i))))
         (member (car i) s :test 'EQ)))))))
   ((lambda (fdef)
     (fdef fdef set1 set2))
    (lambda (fname s1 s2)
     (if s1
      ((lambda (elem result)
        (if (member elem s2 :test 'EQ)
         (cons elem result)
         result))
       (car s1)
       (fname fname (cdr s1) s2)))))))

вариант, который выполняется в XLISP-PLUS 3.04
Код
(defun F (set1 set2)
  ((lambda (intersect)
    (if intersect
     ((lambda (fdef)
       (funcall fdef fdef set2 intersect))
      (lambda (fname s i)
       (if (null i) T
        ((lambda (found)
          (if found
           (funcall fname fname (cdr found) (cdr i))))
         (member (car i) s :test 'EQ)))))))
   ((lambda (fdef)
     (funcall fdef fdef set1 set2))
    (lambda (fname s1 s2)
     (if s1
      ((lambda (elem result)
        (if (member elem s2 :test 'EQ)
         (cons elem result)
         result))
       (car s1)
       (funcall fname fname (cdr s1) s2)))))))

1) «...если одинаковые элементы расположены...»:
вариант теоретический
Код
(defun F (set1 set2)
  ((lambda (intersect)
    (if intersect
     ((lambda (fdef)
       (fdef fdef set2 intersect))
      (lambda (fname s i)
       (if (null i) T
        ((lambda (found)
          (if found
           (fname fname (cdr found) (cdr i))))
         (member (car i) s :test 'EQUAL)))))))
   ((lambda (fdef)
     (fdef fdef set1 set2))
    (lambda (fname s1 s2)
     (if s1
      ((lambda (elem result)
        (if (member elem s2 :test 'EQUAL)
         (cons elem result)
         result))
       (car s1)
       (fname fname (cdr s1) s2)))))))

вариант, который выполняется в XLISP-PLUS 3.04
Код
(defun F (set1 set2)
  ((lambda (intersect)
    (if intersect
     ((lambda (fdef)
       (funcall fdef fdef set2 intersect))
      (lambda (fname s i)
       (if (null i) T
        ((lambda (found)
          (if found
           (funcall fname fname (cdr found) (cdr i))))
         (member (car i) s :test 'EQUAL)))))))
   ((lambda (fdef)
     (funcall fdef fdef set1 set2))
    (lambda (fname s1 s2)
     (if s1
      ((lambda (elem result)
        (if (member elem s2 :test 'EQUAL)
         (cons elem result)
         result))
       (car s1)
       (funcall fname fname (cdr s1) s2)))))))

Автор: yarus88 13.4.2009, 19:22
Спасибо! Но можно еще комментарии? А то я в лиспе ваще не понимаю :(

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)