Функция сопоставления символьных выражений для построения умозаключений - Lisp

Узнай цену своей работы

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

Дана функция match, с помощью которой, путём сопоставления символьных выражений, строятся простейшие умозаключения, выводы, диалоги.
(defun match (p d)
    (cond
        ((and (null p) (null d)) t)
        ((or  (null p) (null d)) nil)
        ((or  (equal (car p) '?)
              (equal (car p) (car d))
              (match (cdr p) (cdr d))))))
  (match '(цвет яблока красный) '(цвет яблока красный)) ==> t  (match '(цвет яблока красный) '(цвет яблока зеленый)) ==> nil    (match '(цвет яблока ?) '(цвет яблока зеленый)) ==> t    (match '(цвет ? красный) '(цвет яблока красный)) ==> t
В HomeLisp эта функция не работает (во всяком случае, пока не добавить t в последнее "условие" cond (или что это?)), но работает в LispWorks, правда, криво работает. Проблема в том, что, как ни крути: (match '(цвет яблока красный) '(цвет яблока зеленый)) ==> всё равно T, хотя должно быть nil. В чём может быть проблема? Интересно узнать, как вообще работает/должна работать эта последняя конструкция в cond.

Решение задачи: «Функция сопоставления символьных выражений для построения умозаключений»

textual
Листинг программы
(defun match (p d)
    (cond 
        ((and (null p) (null d)) t)   ; опущена закрывающая скобка условия and
        ((or (null p) (null d)) nil)
        ((or (equal (car p) '?)       
             (equal (car p) (car d))) (match (cdr p) (cdr d))) ; здесь всё на месте
        ((equal (car p) '*)
            (cond 
                ((match (cdr p) d))       ; а здесь зачем-то лишние обрамляющие скобки  
                ((match (cdr p) (cdr d))) ; или отсутствие каких-либо доп. условий
                ((match p (cdr d)) )))))      ; непонятно, как такое может работать

Объяснение кода листинга программы

В коде определена функция match, которая выполняет сопоставление символьных выражений для построения умозаключений. Функция принимает два аргумента: p и d. Если p и d равны null, то функция возвращает t. Иначе, если p или d равны null, то функция возвращает nil. Если p и d не равны null, то функция проверяет, являются ли первый элемент p и d одинаковыми. Если это так, то функция вызывает себя же, чтобы сопоставить остальные элементы. Если первый элемент p равен символу ', то функция вызывает себя же, чтобы сопоставить остальные элементы, но только если остальные элементы соответствуют d. Код, который находится внутри (match (cdr p) d), (match (cdr p) (cdr d)) и (match p (cdr d)) должен быть оформлен в виде дополнительного условия в скобках. Вот так выглядит исправленный код: (defun match (p d) (cond ((and (null p) (null d)) t) ((or (null p) (null d)) nil) ((or (equal (car p) '?) (equal (car p) (car d))) (match (cdr p) (cdr d))) ((equal (car p) ') (cond ((match (cdr p) d)) ((match (cdr p) (cdr d))) ((match p (cdr d)) )))))

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.857 из 5
Похожие ответы