Странное Контрактное Нарушение в Суде - PullRequest
0 голосов
/ 25 марта 2020

У меня есть judgement со следующим контрактом:

(define-judgment-form DynamicLam
  #:mode     (down I I O O)
  #:contract (down Γ e Γ e)

  [----------------"Lambda"
   (down Γ_0 z_0 Γ_0 z_0)]
  ;; rest of the code ...
)

Когда я запускаю это:

(define empty (term ()))
(redex-match? DynamicLam Γ empty)
(redex-match? DynamicLam e lam1^*)
(redex-match? DynamicLam z lam1^*)
(judgment-holds (down empty lam1^* empty lam1^*))

Я получаю обратно:

# т

# т

# т

. , вниз: входные значения суждения не соответствуют его контракту; (неизвестные выходные значения обозначены _) контракт: (вниз Γ e Γ e) значения: (вниз пустой lam1 ^ * _ _)

Но это не имеет смысла, потому что я четко использовал redex-match? выше для проверки:

  • Это empty соответствует Γ
  • Это lam1^* соответствует e
  • И, кроме того, lam1^* соответствует z.

Чего мне не хватает? Есть ли в значении #:contract нечто большее, чем просто совпадение Γ e Γ e?

1 Ответ

0 голосов
/ 25 марта 2020

Я решил проблему, изменив #:mode на (down I I I I) вместо (down I I O O) и изменив

(judgment-holds (down empty lam1^* empty lam1^*))

на

(judgment-holds (down ,empty ,lam1^* ,empty ,lam1^*))

Изменение , делает для меня много смысла, но я до сих пор не понимаю, почему два выхода должны были быть входными данными, так что если кто-то может или отредактировать этот ответ, чтобы объяснить это, или предоставить комментарий или другой ответ, объясняющий эту тонкость, это было бы фантастически c.

...