Задание выглядит так: Написать программу на языке XLisp, определяющую компоненты связности данного неориентированного графа. Каждая компонента связности - список вершин, следовательно, решение задачи должен быть список списков. Указание: запрограммируйте предварительно предикат (path X Y), проверяющий, существует ли путь из вершины X в вершину Y. Помогите разобраться...Опишите пожайлуста построчно программу, что делает в каждом случае функция начиная с 33 строчки Код | (defun graf(f k) (cond ((null f) '(vy ne vveli ni odnoi vershiny)) ((err1 f) '(vershina ne mozhet byt spiskom)) ((err2 k) '(oshibka v ukazanii rebra esli net reber vvedite () )) ((err3 k f) '(vvedeny nesuschestvuyuschie rebra)) (t (grafdim f k)) ) ) (defun err1(f1) (cond ((null f1) NIL) ((atom (first f1)) (err1 (rest f1))) (t T) ) ) (defun err2(f2) (cond ((null f2) NIL) ((atom (first f2)) T) ((= (length (first f2)) 2) (err2 (rest f2))) (t T) ) ) (defun err3(f3 f1) (eqdim (remove-duplicates (slit f3)) f1 f1) ) (defun eqdim(x y m) (cond ((null x) NIL) ((null y) T) ((eql (first x) (first y)) (eqdim (rest x) m m)) ((not (eql (first x) (first y))) (eqdim x (rest y) m)) (t T) ) ) (defun slit(f) (if (null f) f (append (first f) (slit (rest f))) ) ) (defun grafdim(s x) (osno s x nil)) (defun osno(a b c) (cond ((null a) c) ((path a b) (setq m (pap b (first a) (list(first a)))) (osno (remdel m a) b (cons m c))) (t (osno (rest a) b (cons (list(first a)) c))) ) ) (defun remdel(h j) (if (null h) j (remdel (rest h) (remove (first h) j)) ) ) (defun path(x y) (cond ((eql (first(first y)) (first x)) T) ((eql (second(first y)) (first x)) T) (t (if (null y) NIL (path x (rest y)))) ) ) (defun pap(v r el) (if (null r) (remove-duplicates el) (pap (mam v r nil) (first (phun v r nil)) (phun v r el)) ) ) (defun phun(e x z) (cond ((eql (first(first e)) x) (phun (rest e) x (cons(second(first e)) z))) ((eql (second(first e)) x) (phun (rest e) x (cons(first(first e)) z))) (t (if (null e) z (phun (rest e) x z)) )) ) (defun mam(s f z1) (cond ((eql (first(first s)) f) (mam (rest s) f z1)) ((eql (second(first s)) f) (mam (rest s) f z1)) (t (if (null s) z1 (mam (rest s) f (cons (first s) z1))) )) )
|
Это сообщение отредактировал(а) LFC - 26.5.2009, 06:00
|