lisp-"машина: ожидается нарушение контракта: пара? дано: ()" при уничтожении объекта в модели контроля доступа

Напишите процедуру для уничтожения объекта в моей модели контроля доступа и смоделируйте каждую ситуацию. Это мой код

 (define st1 (term (st 3 2 (,s0 ,s1 ,s2) (,o0 ,o1) ,br ,m1)))
 (define m1 (term ((,s0 control ,s0) (,s1 (trans ,r1) ,o0) (,s2 ,r2 ,o1))))
 (define r1 (term read))
 (define r2 (term write))
 (define br (term (,r1 ,r2)))
 (define-language GD 
 [Sub   (sub natural)]
 [PObj  (obj natural)]
 [Obj   Sub
     PObj]
 [AR    own
     control]
  [BR    (variable-except own control)]
  [TR    (trans BR)]
  [Right BR
     AR
     TR]
  [Priv  (Sub Right Obj)]
  [S     (Root Sub ...)]
  [O     (PObj ...)]
  [R     (BR ...)]
  [M     (Priv ...)]
  [State (st natural natural S O R M)]
  [Root  (sub 0)]
)

 (define s1 (term (sub 1)))
 (define s2 (term (sub 2)))
  (define s0 (term (sub 0)))

 (define o0 (term (obj 0)))
  (define o1 (term (obj 1)))
 (define o2 (term (obj 2)))
 (define o3 (term (obj 3)))

Вот тестовый код.

   (define red1
  (reduction-relation
   GD
   (--> (st natural_1 natural_2
        S (PObj_0 ... PObj_2 PObj_4 ...)
        R M_1)
    (st natural_1 ,(- (term natural_2) 1)
        S (PObj_0 ... PObj_4 ...)
        R M_2)
    (where (PObj_1 ... PObj_2 PObj_3 ...) (PObj_0 ... PObj_2 PObj_4 ...))
    (where M_2 ,(destroy-Obj (term (PObj_2)) (term M_1)))
    (computed-name (term (destroy PObj_2))))
   )
  )

(define (destroy-Obj Obj matrix)
  (let ([o1 (third (car matrix))])
(cond
[(eqv? (first Obj) 'obj)
 (cond
   [(eqv? o1 Obj) destroy-Obj Obj (cdr matrix)]
   [else (cons (car matrix) (destroy-Obj Obj (cdr matrix)))])]

[else (cons (car matrix) (destroy-Obj Obj (cdr matrix)))])))

Когда я хочу уничтожить один из объектов в тесте st1.I, как это:

(stepper red1 st1)

Я продолжаю получать эту ошибку:

car: contract violation
  expected: pair?
  given: ()

"Матрица" - это матрица, которую я хочу уничтожить в любом списке, включая "Obj". "Obj" может быть o1 или o2. Я положил "М_1" в Матрицу. Я хочу, чтобы положить "m1" из "st1" в "M_1" "m1" был определен. Оно не должно быть пустым. Так почему произошла эта ошибка? Большое спасибо!!

1 ответ

Смотря на код, который вы делаете (third (car matrix)) и на рекурсивном этапе (destroy-Obj Obj (cdr matrix)) подразумевает matrix в конечном итоге не будет пара. Таким образом, ваш код должен обрабатывать событие, когда matrix это не пара или более конкретный () если это гарантированная альтернатива (в случае matrix всегда правильный список).

Я также замечаю последствия, когда (eqv? o1 Obj) является (begin destroy-Obj Obj (cdr matrix)) что так же, как просто (cdr matrix) (cond Термины последствия / альтернатива имеют явные begin). Возможно, вам не хватает скобок, чтобы вы действительно имели в виду (destroy-Obj Obj (cdr matrix)),

Другие вопросы по тегам