Попытка определить маленький язык с помощью redex

Я следую учебному пособию по Redex и в то же время строю модель для типизированных арифметических выражений, как это описано в "Типах и языках программирования" Пирса.

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

Сначала я определил синтаксис языка.

(define-language ty-exp
  [E  (ttrue)
      (ffalse)
      (zero)
      (suc E)
      (ppred E)
      (iszero E)
      (iff E E E)]
  [T (nat)
     (bool)])

Далее я определил систему типов без проблем.

(define-judgment-form ty-exp
  #:mode (types I O)
  #:contract (types E T)

  [
   ----------------------"T-zero"
    (types (zero) (nat))
  ]

  [
   -------------------------- "T-false"
     (types (ffalse) (bool))
  ]

  [
   -------------------------- "T-true"
     (types (ttrue) (bool))
  ]

  [
     (types E (nat))
   -------------------------- "T-suc"
     (types (suc E) (nat))
  ]

  [
     (types E (nat))
   -------------------------- "T-pred"
     (types (ppred E) (nat))
  ]

  [
     (types E (nat))
   -------------------------- "T-iszero"
     (types (iszero E) (bool))
  ]

  [
   (types E_1 (bool))
   (types E_2 T_1)
   (types E_3 T_1)
   -------------------------- "T-iff"
   (types (iff E_1 E_2 E_3) (T_1))
  ]
)

Насколько я понимаю, нам нужно определить семантику, используя контексты оценки. Таким образом, мой следующий шаг должен был определить такие контексты и значения для языка.

(define-extended-language ty-exp-ctx-val ty-exp
  (C (suc C)
     (ppred C)
     (iszero C)
     (iff C E E)
     hole)
  (NV (zero)
      (suc NV))
  (BV (ttrue)
      (ffalse))
  (V  (NV)
      (BV)))

Нетерминальный C обозначает контексты, NV для числовых значений, BV для логических значений и V для ценностей. Используя определение значений, я определил функцию для проверки, является ли выражение значением.

(define v? (redex-match ty-exp-ctx-val V))

Используя эту настройку, я попытался определить операционную семантику для этого языка. В книге Пирса такая семантика (без контекстов оценки) выглядит следующим образом:

e --> e'
---------------- (E-suc)
suc e --> suc e'

------------------ (E-pred-zero)
pred zero --> zero

      NV e
------------------- (E-pred-succ)
pred (suc e) --> e

e --> e'
------------------- (E-pred)
pred e --> pred e'


-------------------- (E-iszero-zero)
iszero zero --> true

NV e
------------------------ (E-iszero-succ)
iszero (suc e) --> false


e --> e'
-------------------------(E-iszero)
iszero e --> iszero e'

---------------------- (E-if-true)
if true e e' --> e

-----------------------(E-if-false)
if false e e' --> e'

e --> e'
-----------------------(E-if)
if e e1 e2 --> if e' e1 e2

Чтобы выразить такую ​​семантику, используя контексты оценки, я удалил правилаE-suc, E-pred, E-izero а также E-if и определил правило для перехода в контекст выражения:

e --> e'
--------------(E-context)
E[e] --> E[e']

Насколько я понимаю, нам не нужно представлять такое правило контекста в redex. Итак, я определил семантику для этого языка как:

(define red
  (reduction-relation
   ty-exp-ctx-val
   #:domain E
   (--> (in-hole C (iff (ttrue) E_1 E_2))
        (in-hole C E_1)
        "E-if-true")
   (--> (in-hole C (iff (ffalse) E_1 E_2))
        (in-hole C E_2)
        "E-if-false")
   (--> (in-hole C (iszero (zero)))
        (in-hole C (ttrue))
        "E-iszero-zero")
   (--> (in-hole C (iszero (suc (E))))
        (in-hole C (ffalse))
        (side-condition (v? (term E)))
        "E-iszero-suc")
   (--> (in-hole C (ppred (zero)))
        (in-hole C (zero))
        "E-pred-zero")
   (--> (in-hole C (ppred (suc (E))))
        (in-hole C (E))
        (side-condition (v? (term E)))
        "E-pred-suc")
 ))

Теперь мы подошли к проблеме: когда я пытался казнить

(traces red (term (iif (iszero zero) ttrue ffalse)))

Ракетка возвращает следующее сообщение об ошибке:

 reduction-relation: relation not defined for (iif (iszero (zero)) (ttrue) (ffalse))

Конечно, я делаю что-то глупое, но я не могу понять, что. Может ли кто-нибудь помочь мне с этим?

1 ответ

Решение

После запуска программы я вижу в чем проблема.

Пытаться:

(traces red (term (iff (iszero (zero)) (ttrue) (ffalse))))

В

(define-language ty-exp
  [E  (ttrue)
      (ffalse)
      (zero)
      (suc E)
      (ppred E)
      (iszero E)
      (iff E E E)]
  [T (nat)
     (bool)])

у вас есть круглые скобки ttrue, ffalse а также zero,

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