Skip to content

Commit 138a5d3

Browse files
committed
add statement for subst induction and use support instead of freshness
1 parent 75b7721 commit 138a5d3

File tree

2 files changed

+29
-15
lines changed

2 files changed

+29
-15
lines changed

nominal/core.mm1

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,9 @@ def swap {a b: EVar} (phi: Pattern a b): Pattern a b = $ (sym swap_sym) @@ eVar
2525
def moot_swap {a: EVar} (phi: Pattern a): Pattern a = $ (sym swap_sym) @@ eVar a @@ eVar a @@ phi $;
2626
term abstraction_sym: Symbol;
2727
def abstraction (phi rho: Pattern): Pattern = $ (sym abstraction_sym) @@ phi @@ rho $;
28-
term freshness_sym: Symbol;
29-
def freshness {a: EVar}: Pattern a = $ (sym freshness_sym) @@ eVar a $;
28+
term supp_sym: Symbol;
29+
def supp (phi: Pattern): Pattern = $ (sym supp_sym) @@ phi $;
30+
def fresh_for {a: EVar} (phi: Pattern a): Pattern a = $ ~ (a in supp phi) $;
3031

3132
def EV_pattern {.a .b: EVar} (alpha phi: Pattern): Pattern =
3233
$ s_forall alpha a (s_forall alpha b ((swap a b phi) == phi)) $;
@@ -39,10 +40,10 @@ axiom function_abstraction:
3940
$ is_atom_sort alpha $ >
4041
$ is_nominal_sort tau $ >
4142
$ ,(is_function '(sym abstraction_sym) '[alpha tau] '(sort_abstraction alpha tau)) $;
42-
axiom pred_freshness:
43+
axiom multifunction_supp:
4344
$ is_atom_sort alpha $ >
4445
$ is_nominal_sort tau $ >
45-
$ ,(is_multi_function '(sym freshness_sym) '[alpha] 'tau) $;
46+
$ ,(is_multi_function '(sym supp_sym) '[tau] 'alpha) $;
4647

4748
axiom EV_abstraction {a b: EVar} (alpha tau: Pattern) (phi psi: Pattern a b):
4849
$ is_atom_sort alpha $ >
@@ -87,18 +88,18 @@ axiom F1 (alpha tau: Pattern) {a b: EVar} (phi: Pattern a b):
8788
$ (is_atom a alpha) ->
8889
(is_atom b alpha) ->
8990
(is_of_sort phi tau) ->
90-
((phi C= freshness a) /\ (phi C= freshness b) -> ((swap a b phi) == phi)) $;
91+
((fresh_for a phi) /\ (fresh_for b phi) -> ((swap a b phi) == phi)) $;
9192
axiom F23 (alpha1 alpha2: Pattern) {a b: EVar}:
9293
$ is_atom_sort alpha1 $ >
9394
$ is_atom_sort alpha2 $ >
9495
$ (is_atom a alpha1) ->
9596
(is_atom b alpha2) ->
96-
(b in freshness a) $;
97+
(fresh_for a (eVar b)) $;
9798
axiom F4 (alpha tau phi: Pattern) {a: EVar}:
9899
$ is_atom_sort alpha $ >
99100
$ is_nominal_sort tau $ >
100101
$ (is_of_sort phi tau) ->
101-
(s_exists alpha a (phi C= freshness a)) $;
102+
(s_exists alpha a (fresh_for a phi)) $;
102103
axiom A1_same (alpha tau: Pattern) {a: EVar} (phi rho: Pattern a):
103104
$ is_atom_sort alpha $ >
104105
$ is_nominal_sort tau $ >
@@ -114,7 +115,7 @@ axiom A1 (alpha tau: Pattern) {a b: EVar} (phi rho: Pattern a b):
114115
(is_of_sort phi tau) ->
115116
(is_of_sort rho tau) ->
116117
(((abstraction (eVar a) phi) == (abstraction (eVar b) rho)) <->
117-
((rho C= freshness a) /\ ((swap a b phi) == rho))) $;
118+
((fresh_for a rho) /\ ((swap a b phi) == rho))) $;
118119
axiom A2 (alpha tau: Pattern) {x a y: EVar}:
119120
$ is_atom_sort alpha $ >
120121
$ is_nominal_sort tau $ >

nominal/lambda.mm1

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -172,28 +172,41 @@ theorem induction_principle (exp_pred exp_suff_fresh: Pattern)
172172

173173

174174
term subst_sym: Symbol;
175-
def subst (phi1 phi2 phi3: Pattern): Pattern = $ (sym subst_sym) @@ phi1 @@ phi2 @@ phi3 $;
175+
def subst {a: EVar} (phi1 phi2: Pattern a): Pattern a = $ (sym subst_sym) @@ (eVar a) @@ phi1 @@ phi2 $;
176176

177-
axiom function_subst: $ ,(is_function '(sym subst_sym) '[Exp Var Exp] 'Exp) $;
177+
axiom function_subst: $ ,(is_function '(sym subst_sym) '[Var Exp Exp] 'Exp) $;
178178
axiom subst_same_var {a: EVar} (plug: Pattern a):
179179
$ (is_var (eVar a)) ->
180180
(is_exp plug) ->
181-
((subst (lc_var (eVar a)) (eVar a) plug) == plug) $;
181+
((subst a (lc_var (eVar a)) plug) == plug) $;
182182
axiom subst_diff_var {a b: EVar} (plug: Pattern a b):
183183
$ (is_var (eVar a)) ->
184184
(is_var (eVar b)) ->
185185
(is_exp plug) ->
186-
((subst (lc_var (eVar a)) (eVar b) plug) == (lc_var (eVar a))) $;
186+
((subst b (lc_var (eVar a)) plug) == (lc_var (eVar a))) $;
187187
axiom subst_app {a: EVar} (plug phi1 phi2: Pattern a):
188188
$ (is_var (eVar a)) ->
189189
(is_exp plug) ->
190190
(is_exp phi1) ->
191191
(is_exp phi2) ->
192-
((subst (lc_app phi1 phi2) (eVar a) plug) == (lc_app (subst phi1 (eVar a) plug) (subst phi2 (eVar a) plug))) $;
192+
((subst a (lc_app phi1 phi2) plug) == (lc_app (subst a phi1 plug) (subst a phi2 plug))) $;
193193
axiom subst_lam {a b: EVar} (plug phi: Pattern a b):
194194
$ (is_var (eVar a)) ->
195195
(is_var (eVar b)) ->
196196
(is_exp plug) ->
197197
(is_exp phi) ->
198-
(plug C= freshness a) ->
199-
((subst (lc_lam_a a phi) (eVar b) plug) == (lc_lam_a a (subst phi (eVar b) plug))) $;
198+
(fresh_for a plug) ->
199+
((subst b (lc_lam_a a phi) plug) == (lc_lam_a a (subst b phi plug))) $;
200+
201+
202+
203+
204+
theorem subst_induction {a b: EVar} (phi1 phi2 phi3: Pattern):
205+
$ (is_var (eVar a)) ->
206+
(is_var (eVar b)) ->
207+
(is_exp phi1) ->
208+
(is_exp phi2) ->
209+
(is_exp phi3) ->
210+
(fresh_for a phi3) ->
211+
((subst b (subst a phi1 phi2) phi3) == (subst a (subst b phi1 phi3) (subst b phi2 phi3))) $ =
212+
'();

0 commit comments

Comments
 (0)