семантический список в схеме - PullRequest
0 голосов
/ 06 ноября 2018

В настоящее время я работаю над реализацией стандартной семантической сети, и я не потерян. У меня есть глобальный список assc:

(define *database* '())

и пытаюсь заполнить список стандартной формой как

((hellipcopter (isa (air-vehicle))         
               (has-part (propeller door)))
               .
               . 
               .

Из заявлений

(has-part helicopter propeller)
(has-part helicopter door)
(isa helicopter air-vehicle)

Вот моя попытка

    (define (process-relation rel)
       (set! *database* (cons (cons (cons (cadr rel) (car rel)) (caddr rel))*database*)))

который печатает таким ужасным образом

       ((helicopter . has-part) . propeller)
       ((propeller . has-part) . blade)

Я новичок в схеме, как вы можете сказать, поэтому у меня есть несколько вопросов.

  1. Почему минусы образуют утверждение так, как оно? (х. у)
  2. Как бы вы добавили несколько частей, например, к одному и тому же объекту?
  3. Что бы сделать, чтобы это исправить?

1 Ответ

0 голосов
/ 06 ноября 2018

Список представляет собой цепочку минусов. например. если вы оцениваете '(1 . (2 . (3 . ()))), вы получите (1 2 3), поскольку, в то время как считыватель читает и пунктирную форму, и форму списка, принтер печатает форму списка, где это возможно. например. если cdr является парой или (), в нем пропускаются . и одна пара круглых скобок. Если последний элемент в цепочке не является (), это неправильный список и потребует точечной формы даже для печати. например. '(1 . (2 . 3)) - это (1 2 . 3).

(list 1 2 3) совпадает с (cons 1 (cons 2 (cons 3 '())))

Чтобы исправить код в некоторых местах, которые вы используете cons, вы должны использовать list или добавить больше cons, чтобы значения были только в позиции car.

...