36963

Робота з базою знань «План-карта шляхів»

Лабораторная работа

Информатика, кибернетика и программирование

COM командою lod ‘edit Сформувати файл програми для роботи з базою знань defun можливо стан карта mpcn 'lmbd правило if eql стан cr правило list правило nil карта defun вглибину поточнийплан ppend можливо cdr cr поточнийплан план1...

Украинкский

2013-09-23

40 KB

1 чел.

Лабораторна робота №1

Робота з базою знань «План-карта шляхів»

План виконання роботи:

  1.  Завантажити оболонку muLisp (для цього запустити на виконання файл MULISP.EXE, яка розташована за адресою <Disk>:\Lisp_Prog\MULISP)
  2.  Завантажити редактор EDIT.COM (командою (loadedit))
  3.  Сформувати файл програми для роботи з базою знань

(defun можливо (стан карта )

   (mapcan '(lambda (правило)

                               (if (eql стан (car правило))

                                     (list правило) nil )

                 )

               карта)

)

 

(defun в-глибину (поточний-план)

   (append

          (можливо (cadr (car поточний-план)) план-1)

                           (cdr поточний-план))

   )

основна функція пошуку:

(defun пошук (кінець поточний-план маршрут метод)

(cond

    ((null поточний-план) (print (reverse маршрут)) nil)

; поточний план пустий

    ((eql кiнець (cadr (car поточний-план)))

;якщо  кінцевий пункт знайшовся в поточному-планi, тоді закінчити.

               (print  (reverse (cons кiнець маршрут))))

   ((member (cadr (car поточний-план)) маршрут)

;якщо наслідок вже є в маршруті, тоді рекурсивний пошук в cdr-плані.

              (пошук кiнець (cdr поточний-план) маршрут метод) )

;якщо всi попереднi умови не виконуються, тоді перетворимо поточний-;план заданим "методом", доповнимо "маршрут" i рекурсивно здійснюємо ;подальший пошук.

   ( t (пошук кiнець (funcall метод поточний-план)

          (cons (cadr (car поточний-план)) маршрут)

           метод ) ) )

)

(defun як-проїхати (початок кiнець карта метод)

    (пошук кiнець

                (можливо початок карта)

                (list початок)

              метод

   )

)

  1.  Заповнити базу знань через командну строку

$(setq plan1 '((Москва Київ) (Київ Москва) (Львiв Київ) (Київ Львiв) (Київ Харкiв) (Харкiв Київ) (Донецьк Харкiв) (Харкiв Донецьк) (Київ Луганськ) (Луганськ Ніжин) (Ніжин Київ)))

  1.  Викликати функцію пошуку шляху

(як-проїхати початок кінець карта метод)

Виклик функції

$(як-проїхати 'Львiв 'Ніжин план-1 в-глибину)

(Львiв Київ Москва Харкiв Донецьк Луганськ Ніжин)

вiдсiкти непотрiбнi пункти за допомогою наступної функції:

(defun вiдсiкти-лишнє (маршрут карта)

  (cond

       ((equal маршрут (відсікти маршрут карта ))

                 маршрут)

       (t (вiдсiкти-лишнє (вiдсiкти маршрут карта)))))

(defun вiдсiкти (маршрут карта рiшення)

    (cond

           ((null карта) nil)

           ((null маршрут) nil)

         ((null (cadr маршрут))

                  (reverse (cons (car маршрут) рiшення)))

          ((member (list (car маршрут) (cadr маршрут)) карта equal)                      

                         (вiдсiкти (cdr маршрут) карта

                          (cons (car маршрут) рiшення)))

       (t (вiдсiкти (cdr маршрут) карта рiшення))))

Застосуємо розроблену функцію:

$(вiдсiкти-лишнє (як-проїхати 'Львiв 'Ніжин план-1 в-глибину) план-1 )

(Львiв Київ Луганськ Ніжин)