ladder-calculus/coq/terms/eval.v

79 lines
1.8 KiB
Coq
Raw Permalink Normal View History

2024-09-21 00:36:50 +02:00
From Coq Require Import Lists.List.
Import ListNotations.
Require Import Atom.
2024-09-21 13:00:57 +02:00
Require Import debruijn.
Require Import subtype.
Require Import morph.
Require Import typing.
2024-09-21 00:36:50 +02:00
Open Scope ladder_expr_scope.
Inductive is_value : expr_DeBruijn -> Prop :=
| V_TAbs : forall e,
expr_lc [{ Λ e }] ->
2024-09-21 00:36:50 +02:00
is_value [{ Λ e }]
| V_Abs : forall σ e,
expr_lc [{ λ σ e }] ->
2024-09-21 00:36:50 +02:00
is_value [{ λ σ e }]
| V_Morph : forall σ e,
is_value [{ λ σ morph e }]
| V_Ascend : forall τ e,
is_value e ->
is_value [{ e as τ }]
| V_Descend : forall τ e,
is_value e ->
is_value [{ e des τ }]
.
Reserved Notation " s '-->eval' t " (at level 40).
Inductive eval : expr_DeBruijn -> expr_DeBruijn -> Prop :=
| E_App1 : forall e1 e1' e2,
(expr_lc e2) ->
2024-09-21 00:36:50 +02:00
e1 -->eval e1' ->
[{ e1 e2 }] -->eval [{ e1' e2 }]
| E_App2 : forall v1 e2 e2',
(is_value v1) ->
e2 -->eval e2' ->
[{ v1 e2 }] -->eval [{ v1 e2' }]
| E_TypApp : forall e e',
expr_lc [{ Λ e }] ->
2024-09-21 00:36:50 +02:00
e -->eval e' ->
[{ Λ e }] -->eval [{ Λ e' }]
| E_TypAppLam : forall e τ,
expr_lc [{ (Λ e ) }] ->
2024-09-21 00:36:50 +02:00
[{ (Λ e) # τ }] -->eval (expr_open_type τ e)
| E_AppLam : forall τ e a,
expr_lc [{ (λ τ e) }] ->
2024-09-21 00:36:50 +02:00
[{ (λ τ e) a }] -->eval (expr_open a e)
| E_AppMorph : forall τ e a,
expr_lc [{ (λ τ morph e) }] ->
2024-09-21 00:36:50 +02:00
[{ (λ τ morph e) a }] -->eval (expr_open a e)
| E_Let : forall e a,
expr_lc [{ let a in e }] ->
2024-09-21 00:36:50 +02:00
[{ let a in e }] -->eval (expr_open a e)
| E_Ascend : forall τ e e',
(e -->eval e') ->
[{ e as τ }] -->eval [{ e' as τ }]
| E_AscendCollapse : forall τ' τ e,
[{ (e as τ) as τ' }] -->eval [{ e as (τ'~τ) }]
| E_DescendCollapse : forall τ' τ e,
(τ':<=τ) ->
[{ (e des τ') des τ }] -->eval [{ e des τ }]
where "s '-->eval' t" := (eval s t).