Добавил:
wolfain@mail.ru Хз кто это читает, но знайте - открыт к любым новым знакомствам (нет). Хех. Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

4

.txt
Скачиваний:
4
Добавлен:
04.03.2018
Размер:
7.68 Кб
Скачать
(setf *database* ())

(defun add-record (&key d n pt)
    (setf *database* (cons (list :destination d :id n :plan-type pt) *database*)))

(defun printAll (&optional (outstr NIL))
    (dolist (item *database*)
        (print item outstr)))

(add-record :d "Moscow" :n 7 :pt "Boeing 747-8")
(add-record :d "Paris" :n 8 :pt "Boeing 747-400")
(add-record :d "Sicily" :n 6 :pt "Boeing 777")
(add-record :d "Bahia" :n 7 :pt "Boeing 777")
(add-record :d "San jose" :n 8 :pt "Boeing 747-8")
(add-record :d "Paris" :n 6 :pt "Boeing 737")
(add-record :d "Majorca" :n 7 :pt "Boeing 747-8")
(add-record :d "Büchen" :n 8 :pt "Boeing 747-400")
(add-record :d "Cologne" :n 6 :pt "Boeing 787")

(defun match (p d)   (cond      
                         ;;правило 1     
                         ((and (null p)(null d)) t)     
                         ;;правило 2     
                         ((and (null d)           
                               (eq (car p) '$)           
                               (null (cdr p))) t)          
                         ;;один из списков исчерпан     
                         ((or (null p)(null d)) nil)          
                         ;;правило 3 и правило 4     
                         ((or (equal (car p) '?)          
                              (equal (car p) (car d)))      
                          (match (cdr p)(cdr d)))          
                         ;;правило 5 и 6     
                         ((eq (car p) '$)      
                          (cond ((match (cdr p) d) t)        
                              ((match p (cdr d)) t)))          
                         ;;правило 7 - сопоставление списков,включающих подсписки     
                         ((and (not (atom (car p)))           
                               (not (atom (car d)))           
                               (match (car p)(car d)))      
                          (match (cdr p) (cdr d)))          
                         ;;правило 8 – подстановка значения в переменную      
                         ;;пример вызова:(match '(AVTO ?MODEL ?YEAR) '(AVTO ford 1998))     
                         ;;MODEL=ford, YEAR=1998     
                         ((and (atom (car p))           
                               (eq (car-letter (car p)) #\?)           
                               (match (cdr p)(cdr d)))      
                          (set  (cdr-name (car p)) (car d)) t) 
                         ;;правило 9 - подстановка сегмента значений в переменную      
                         ;;пример вызова: (match '(?F $V) '(Petrov 1975 5 October))     
                         ;;F=Petrov, V=(1975 5 October)     
                         ((and (atom (car p))           
                               (eq (car-letter (car p)) #\$))      
                               (cond ((match (cdr p)(cdr d))             
                                      (set (cdr-name (car p)) (list (car d))) t)        
                                   ((match p (cdr d))         
                                    (set (cdr-name (car p))              
                                         (cons (car d)(eval (cdr-name (car p))))) t)))          
                         ;; правило 10 - обработка пакета ограничений, если в пакете есть «?»     
                         ((and (not(atom (car p)))           
                               (eq (caar p)  'restrict)           
                               (eq (cadar p) '?)           
                               (and-to-list  
                                   (mapcar  #'(lambda (pred)                         
                                                  (funcall pred (car d))) (cddar p))))      
                          (match (cdr p)(cdr d)))          
                         ;; правило 11 - обработка пакета ограничений, если в пакете есть «?V»     
                         ;; например: (match '((restrict  ?V  integerp  evenp) b c) '(36  b  c))     
                         ((and (not (atom (car p)))           
                               (not (atom  d))           
                               (eq (caar p)  'restrict)           
                               (eq (car-letter (cadar p)) #\?)           
                               (and-to-list             
                                (mapcar  #'(lambda (pred)                         
                                                   (funcall pred (car d))) (cddar p)))           
                               (match (cdr p)(cdr d)))      
                               (set (cdr-name (cadar p)) (car d)) t))) 
;;;;<2. Вспомогательные функции 
;;; выделение первой литеры из имени 
(defun car-letter (x) 
    (if (not (numberp x)) 
        (car (coerce (string x) 'list)))) 
;;; возвращает имя без первой 
(defun cdr-name (x) (intern  (coerce (cdr (coerce (string x) 'list)) 'string))) 
;;; проверяет,  все ли элементы списка lis имеют значение T 
(defun and-to-list ( lis )   
    ;lis - список логических значений    
    (let ((res t))   
         (dolist (temp lis res)     
             (setq res (and res temp)))))

(defun get-matches (p db)    
    ;db - база данных    
    ;p  - запрос (образец)    
    (cond ((null db) nil)              
        ((match p (car db))               
         (cons (car db) (get-matches p (cdr db))))              
        (t (get-matches p (cdr db)))))

(defun answer-generator()
    (setf fact (read))
    (cond
        ;(Выведи все записы пожалуйста)
        ((match '($ все записы $) fact)
         (setf matches (get-matches '(:destination ? :id ? :plan-type ?) *database*))
         (print "All fligts:")
         (dolist (item matches) 
             (print (getf item :id))
             (prin1 (getf item :destination))
             (prin1 (getf item :plan-type))))
        ;(where can I fly using boeing 777)
        ((match '($ where $ boeing 777 $) fact)
         (setf matches (get-matches '(:destination ? :id ? :plan-type "Boeing 777") *database*))
         (princ "You can visit this towns: ")
         (dolist (item matches) 
             (princ (getf item :destination))
             (princ ", ")))
        ;(what can you say about flight number 8)
        ((match '($ what $ say about $ number ?number $) fact)
         (get-matches `(:destination ?dest :id ,number :plan-type ?type) *database*)
         (princ type)
         (princ " flying in ")
         (princ dest))
        ;(what can you say about flights in "Paris")
        ((match '($ what $ say about $ flights in $ ?dest $) fact)
         (setf matches (get-matches `(:destination ,dest :id ? :plan-type ?) *database*))
         (princ "You can visit ")
         (princ dest)
         (princ " by flight numbers ")
         (dolist (item matches)
             (princ (getf item :id))
             (princ ", "))
         (princ " using ")
         (dolist (item matches)
             (princ (getf item :plan-type))
             (princ ", "))
         (princ "respectively"))
        (t (princ "Unknown request"))))

(answer-generator)
Соседние файлы в предмете Искусственный интеллект