lisp - "汽车:合同违规预期:配对?给出:()"在访问控制模型中销毁obj

时间:2017-08-27 03:38:22

标签: scheme access plt-redex

编写一个程序来销毁我的访问控制模型中的对象并模拟每种情况。 这是我的代码。

 (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。 我把" M_1"进入黑客帝国。我想把" m1" " st1"进入" M_1" " M1"已定义。它不应该是空的。为什么会出现这个错误? 非常感谢!!

1 个答案:

答案 0 :(得分: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))