Получить реберный список графа на лиспе - Lisp

Формулировка задачи:

Помогите решить задачу, в вузе очень плохо объясняют почему-то именно этот предмет, а спрашивают жестко: "Граф задан с помощью списков. Построить его реберный граф". с комментами, если можно конечно, как работает прога.Примечание : пусть задан граф G, тогда его рёберный граф L(G) — это такой граф, что две вершины графа L(G) смежны тогда и только тогда, когда их соответствующие рёбра имеют общую вершину («смежны») в G.Пример работующей проги работающей программы сделайте пожалуйста с этим деревом: https://upload.wikimedia.org/wikiped...y_tree.svg.png Заранее спасибо.

Код к задаче: «Получить реберный список графа на лиспе - Lisp»

textual
;; Вспомогательная функция, проверяющая, имеют ли два
;; несовпадающих ребра общую вершину
 
(defun has-common-vertex (p1 p2)
  (and (not (equal p1 p2)) (or (member (car p1) p2) (member (cadr p1) p2))))
 
;; Построение реберного графа
 
(defun edge-graph (graph)
  (let ((e-g nil)) ;; здесь будет результат
    (dolist (e1 graph nil) ;; пробег по всем парам ребер
      (dolist (e2 graph nil) ;; графа
         (when (and (has-common-vertex e1 e2) ;; если пара имеет общую вершину
                    (not (member (list e1 e2) e-g))  ;; и еще не присутствует в реберном графе
                    (not (member (list e2 e1) e-g))) (push (list e1 e2) e-g)))) (renum e-g graph))) ;; добавим ее туда
 
;; Перенумерация
                   
(defun renum (e-g graph)
  (mapcar (lambda (r) (list (+ 1 (position (car r) graph))
                            (+ 1 (position (cadr r) graph)))) e-g))
 
(edge-graph '((1 2) (1 3) (2 3) (3 4))) ;; граф с последней картинки
 
==> ((3 4) (2 4) (2 3) (1 3) (1 2)) ;; реберный граф

5   голосов, оценка 4.000 из 5


СОХРАНИТЬ ССЫЛКУ