Вызвать суждение изнутри редукционного отношения
Я работаю над определением языка, который имеет приведение типов и подтипы следующим образом:
(define-language base
(t ::= int any)
(e ::= number (cast t e))
#| stuff ... |#)
Я тогда определяю следующую форму суждения по этому:
(define-judgment-form base
#:mode (<: I I)
#:contract (<: t t)
[------
(<: t t)]
[------
(<: int any)])
И теперь, в моей редукции, я хочу написать что-то вроде
(define b-> (reduction-relation base
(--> (cast t v)
v
(where-judgment-holds (<: (typeof v) t)))))
Где мы предполагаем, что (typeof v)
возвращает тип значения v
, Насколько я могу сказать, нет ничего подобного where-judgment-holds
в библиотеке Redex, и хотя я могу обойти это без кавычек, было бы неплохо, если бы в Redex было что-то встроенное.
1 ответ
Решение
То, что вы ищете на самом деле называется judgment-holds
и это работает в вашем примере именно там, где вы положили where-judgment-holds
:
(define b-> (reduction-relation base
(--> (cast t v)
v
(judgment-holds (<: (typeof v) t)))))