Welcome to Abella 2.0.5-dev.
Abella < Specification "breduce".
Reading specification "breduce".
Abella < Close tm, p.
Abella < Define ctx2 : olist -> olist -> prop by
ctx2 nil nil;
nabla x p, ctx2 (bred x x :: G) (path x p :: D) := ctx2 G D;
nabla x, ctx2 ((pi u\bred N u => bred x u) :: G) ((pi q\path N q => path x q) :: D) := ctx2 G D.
Abella < Define name : tm -> prop by
nabla n, name n.
Abella < Define fresh : tm -> tm -> prop by
nabla n, fresh n X.
Abella < Define pname : p -> prop by
nabla p, pname p.
Abella < Theorem ctx2_mem_G :
forall G D F, ctx2 G D -> member F G -> (exists x, F = bred x x /\ name x) \/
(exists x N, F = pi u\bred N u => bred x u /\ fresh x N).
============================
forall G D F, ctx2 G D -> member F G ->
(exists x, F = bred x x /\ name x) \/
(exists x N, F = pi u\bred N u => bred x u /\ fresh x N)
ctx2_mem_G < induction on 1.
IH : forall G D F, ctx2 G D * -> member F G ->
(exists x, F = bred x x /\ name x) \/
(exists x N, F = pi u\bred N u => bred x u /\ fresh x N)
============================
forall G D F, ctx2 G D @ -> member F G ->
(exists x, F = bred x x /\ name x) \/
(exists x N, F = pi u\bred N u => bred x u /\ fresh x N)
ctx2_mem_G < intros.
Variables: G D F
IH : forall G D F, ctx2 G D * -> member F G ->
(exists x, F = bred x x /\ name x) \/
(exists x N, F = pi u\bred N u => bred x u /\ fresh x N)
H1 : ctx2 G D @
H2 : member F G
============================
(exists x, F = bred x x /\ name x) \/
(exists x N, F = pi u\bred N u => bred x u /\ fresh x N)
ctx2_mem_G < case H1.
Subgoal 1:
Variables: F
IH : forall G D F, ctx2 G D * -> member F G ->
(exists x, F = bred x x /\ name x) \/
(exists x N, F = pi u\bred N u => bred x u /\ fresh x N)
H2 : member F nil
============================
(exists x, F = bred x x /\ name x) \/
(exists x N, F = pi u\bred N u => bred x u /\ fresh x N)
Subgoal 2 is:
(exists x, F n1 n2 = bred x x /\ name x) \/
(exists x N, F n1 n2 = pi u\bred N u => bred x u /\ fresh x N)
Subgoal 3 is:
(exists x, F n1 = bred x x /\ name x) \/
(exists x N, F n1 = pi u\bred N u => bred x u /\ fresh x N)
ctx2_mem_G < case H2.
Subgoal 2:
Variables: F D1 G1
IH : forall G D F, ctx2 G D * -> member F G ->
(exists x, F = bred x x /\ name x) \/
(exists x N, F = pi u\bred N u => bred x u /\ fresh x N)
H2 : member (F n1 n2) (bred n1 n1 :: G1)
H3 : ctx2 G1 D1 *
============================
(exists x, F n1 n2 = bred x x /\ name x) \/
(exists x N, F n1 n2 = pi u\bred N u => bred x u /\ fresh x N)
Subgoal 3 is:
(exists x, F n1 = bred x x /\ name x) \/
(exists x N, F n1 = pi u\bred N u => bred x u /\ fresh x N)
ctx2_mem_G < case H2.
Subgoal 2.1:
Variables: D1 G1
IH : forall G D F, ctx2 G D * -> member F G ->
(exists x, F = bred x x /\ name x) \/
(exists x N, F = pi u\bred N u => bred x u /\ fresh x N)
H3 : ctx2 G1 D1 *
============================
(exists x, bred n1 n1 = bred x x /\ name x) \/
(exists x N, bred n1 n1 = pi u\bred N u => bred x u /\ fresh x N)
Subgoal 2.2 is:
(exists x, F n1 n2 = bred x x /\ name x) \/
(exists x N, F n1 n2 = pi u\bred N u => bred x u /\ fresh x N)
Subgoal 3 is:
(exists x, F n1 = bred x x /\ name x) \/
(exists x N, F n1 = pi u\bred N u => bred x u /\ fresh x N)
ctx2_mem_G < search.
Subgoal 2.2:
Variables: F D1 G1
IH : forall G D F, ctx2 G D * -> member F G ->
(exists x, F = bred x x /\ name x) \/
(exists x N, F = pi u\bred N u => bred x u /\ fresh x N)
H3 : ctx2 G1 D1 *
H4 : member (F n1 n2) G1
============================
(exists x, F n1 n2 = bred x x /\ name x) \/
(exists x N, F n1 n2 = pi u\bred N u => bred x u /\ fresh x N)
Subgoal 3 is:
(exists x, F n1 = bred x x /\ name x) \/
(exists x N, F n1 = pi u\bred N u => bred x u /\ fresh x N)
ctx2_mem_G < apply IH to H3 H4.
Subgoal 2.2:
Variables: F D1 G1
IH : forall G D F, ctx2 G D * -> member F G ->
(exists x, F = bred x x /\ name x) \/
(exists x N, F = pi u\bred N u => bred x u /\ fresh x N)
H3 : ctx2 G1 D1 *
H4 : member (F n1 n2) G1
H5 : (exists x, F n1 n2 = bred x x /\ name x) \/
(exists x N, F n1 n2 = pi u\bred N u => bred x u /\ fresh x N)
============================
(exists x, F n1 n2 = bred x x /\ name x) \/
(exists x N, F n1 n2 = pi u\bred N u => bred x u /\ fresh x N)
Subgoal 3 is:
(exists x, F n1 = bred x x /\ name x) \/
(exists x N, F n1 = pi u\bred N u => bred x u /\ fresh x N)
ctx2_mem_G < case H5.
Subgoal 2.2.1:
Variables: D1 G1 x
IH : forall G D F, ctx2 G D * -> member F G ->
(exists x, F = bred x x /\ name x) \/
(exists x N, F = pi u\bred N u => bred x u /\ fresh x N)
H3 : ctx2 G1 D1 *
H4 : member (bred (x n1) (x n1)) G1
H6 : name (x n1)
============================
(exists x1, bred (x n1) (x n1) = bred x1 x1 /\ name x1) \/
(exists x1 N, bred (x n1) (x n1) = pi u\bred N u => bred x1 u /\
fresh x1 N)
Subgoal 2.2.2 is:
(exists x1, pi u\bred (N n1) u => bred (x n1) u = bred x1 x1 /\ name x1) \/
(exists x1 N1, pi u\bred (N n1) u => bred (x n1) u =
pi u\bred N1 u => bred x1 u /\ fresh x1 N1)
Subgoal 3 is:
(exists x, F n1 = bred x x /\ name x) \/
(exists x N, F n1 = pi u\bred N u => bred x u /\ fresh x N)
ctx2_mem_G < search.
Subgoal 2.2.2:
Variables: D1 G1 x N
IH : forall G D F, ctx2 G D * -> member F G ->
(exists x, F = bred x x /\ name x) \/
(exists x N, F = pi u\bred N u => bred x u /\ fresh x N)
H3 : ctx2 G1 D1 *
H4 : member (pi u\bred (N n1) u => bred (x n1) u) G1
H6 : fresh (x n1) (N n1)
============================
(exists x1, pi u\bred (N n1) u => bred (x n1) u = bred x1 x1 /\ name x1) \/
(exists x1 N1, pi u\bred (N n1) u => bred (x n1) u =
pi u\bred N1 u => bred x1 u /\ fresh x1 N1)
Subgoal 3 is:
(exists x, F n1 = bred x x /\ name x) \/
(exists x N, F n1 = pi u\bred N u => bred x u /\ fresh x N)
ctx2_mem_G < search.
Subgoal 3:
Variables: F D1 N G1
IH : forall G D F, ctx2 G D * -> member F G ->
(exists x, F = bred x x /\ name x) \/
(exists x N, F = pi u\bred N u => bred x u /\ fresh x N)
H2 : member (F n1) ((pi u\bred N u => bred n1 u) :: G1)
H3 : ctx2 G1 D1 *
============================
(exists x, F n1 = bred x x /\ name x) \/
(exists x N, F n1 = pi u\bred N u => bred x u /\ fresh x N)
ctx2_mem_G < case H2.
Subgoal 3.1:
Variables: D1 N G1
IH : forall G D F, ctx2 G D * -> member F G ->
(exists x, F = bred x x /\ name x) \/
(exists x N, F = pi u\bred N u => bred x u /\ fresh x N)
H3 : ctx2 G1 D1 *
============================
(exists x, pi u\bred N u => bred n1 u = bred x x /\ name x) \/
(exists x N1, pi u\bred N u => bred n1 u = pi u\bred N1 u => bred x u /\
fresh x N1)
Subgoal 3.2 is:
(exists x, F n1 = bred x x /\ name x) \/
(exists x N, F n1 = pi u\bred N u => bred x u /\ fresh x N)
ctx2_mem_G < search.
Subgoal 3.2:
Variables: F D1 N G1
IH : forall G D F, ctx2 G D * -> member F G ->
(exists x, F = bred x x /\ name x) \/
(exists x N, F = pi u\bred N u => bred x u /\ fresh x N)
H3 : ctx2 G1 D1 *
H4 : member (F n1) G1
============================
(exists x, F n1 = bred x x /\ name x) \/
(exists x N, F n1 = pi u\bred N u => bred x u /\ fresh x N)
ctx2_mem_G < apply IH to H3 H4.
Subgoal 3.2:
Variables: F D1 N G1
IH : forall G D F, ctx2 G D * -> member F G ->
(exists x, F = bred x x /\ name x) \/
(exists x N, F = pi u\bred N u => bred x u /\ fresh x N)
H3 : ctx2 G1 D1 *
H4 : member (F n1) G1
H5 : (exists x, F n1 = bred x x /\ name x) \/
(exists x N, F n1 = pi u\bred N u => bred x u /\ fresh x N)
============================
(exists x, F n1 = bred x x /\ name x) \/
(exists x N, F n1 = pi u\bred N u => bred x u /\ fresh x N)
ctx2_mem_G < case H5.
Subgoal 3.2.1:
Variables: D1 N G1 x
IH : forall G D F, ctx2 G D * -> member F G ->
(exists x, F = bred x x /\ name x) \/
(exists x N, F = pi u\bred N u => bred x u /\ fresh x N)
H3 : ctx2 G1 D1 *
H4 : member (bred (x n1) (x n1)) G1
H6 : name (x n1)
============================
(exists x1, bred (x n1) (x n1) = bred x1 x1 /\ name x1) \/
(exists x1 N, bred (x n1) (x n1) = pi u\bred N u => bred x1 u /\
fresh x1 N)
Subgoal 3.2.2 is:
(exists x1, pi u\bred (N1 n1) u => bred (x n1) u = bred x1 x1 /\ name x1) \/
(exists x1 N, pi u\bred (N1 n1) u => bred (x n1) u =
pi u\bred N u => bred x1 u /\ fresh x1 N)
ctx2_mem_G < search.
Subgoal 3.2.2:
Variables: D1 N G1 x N1
IH : forall G D F, ctx2 G D * -> member F G ->
(exists x, F = bred x x /\ name x) \/
(exists x N, F = pi u\bred N u => bred x u /\ fresh x N)
H3 : ctx2 G1 D1 *
H4 : member (pi u\bred (N1 n1) u => bred (x n1) u) G1
H6 : fresh (x n1) (N1 n1)
============================
(exists x1, pi u\bred (N1 n1) u => bred (x n1) u = bred x1 x1 /\ name x1) \/
(exists x1 N, pi u\bred (N1 n1) u => bred (x n1) u =
pi u\bred N u => bred x1 u /\ fresh x1 N)
ctx2_mem_G < search.
Proof completed.
Abella < Theorem ctx2_mem_D :
forall G D F, ctx2 G D -> member F D ->
(exists x p, F = path x p /\ name x /\ pname p) \/
(exists x N, F = pi q\path N q => path x q /\ fresh x N).
============================
forall G D F, ctx2 G D -> member F D ->
(exists x p, F = path x p /\ name x /\ pname p) \/
(exists x N, F = pi q\path N q => path x q /\ fresh x N)
ctx2_mem_D < induction on 1.
IH : forall G D F, ctx2 G D * -> member F D ->
(exists x p, F = path x p /\ name x /\ pname p) \/
(exists x N, F = pi q\path N q => path x q /\ fresh x N)
============================
forall G D F, ctx2 G D @ -> member F D ->
(exists x p, F = path x p /\ name x /\ pname p) \/
(exists x N, F = pi q\path N q => path x q /\ fresh x N)
ctx2_mem_D < intros.
Variables: G D F
IH : forall G D F, ctx2 G D * -> member F D ->
(exists x p, F = path x p /\ name x /\ pname p) \/
(exists x N, F = pi q\path N q => path x q /\ fresh x N)
H1 : ctx2 G D @
H2 : member F D
============================
(exists x p, F = path x p /\ name x /\ pname p) \/
(exists x N, F = pi q\path N q => path x q /\ fresh x N)
ctx2_mem_D < case H1.
Subgoal 1:
Variables: F
IH : forall G D F, ctx2 G D * -> member F D ->
(exists x p, F = path x p /\ name x /\ pname p) \/
(exists x N, F = pi q\path N q => path x q /\ fresh x N)
H2 : member F nil
============================
(exists x p, F = path x p /\ name x /\ pname p) \/
(exists x N, F = pi q\path N q => path x q /\ fresh x N)
Subgoal 2 is:
(exists x p, F n1 n2 = path x p /\ name x /\ pname p) \/
(exists x N, F n1 n2 = pi q\path N q => path x q /\ fresh x N)
Subgoal 3 is:
(exists x p, F n1 = path x p /\ name x /\ pname p) \/
(exists x N, F n1 = pi q\path N q => path x q /\ fresh x N)
ctx2_mem_D < case H2.
Subgoal 2:
Variables: F D1 G1
IH : forall G D F, ctx2 G D * -> member F D ->
(exists x p, F = path x p /\ name x /\ pname p) \/
(exists x N, F = pi q\path N q => path x q /\ fresh x N)
H2 : member (F n1 n2) (path n1 n2 :: D1)
H3 : ctx2 G1 D1 *
============================
(exists x p, F n1 n2 = path x p /\ name x /\ pname p) \/
(exists x N, F n1 n2 = pi q\path N q => path x q /\ fresh x N)
Subgoal 3 is:
(exists x p, F n1 = path x p /\ name x /\ pname p) \/
(exists x N, F n1 = pi q\path N q => path x q /\ fresh x N)
ctx2_mem_D < case H2.
Subgoal 2.1:
Variables: D1 G1
IH : forall G D F, ctx2 G D * -> member F D ->
(exists x p, F = path x p /\ name x /\ pname p) \/
(exists x N, F = pi q\path N q => path x q /\ fresh x N)
H3 : ctx2 G1 D1 *
============================
(exists x p, path n1 n2 = path x p /\ name x /\ pname p) \/
(exists x N, path n1 n2 = pi q\path N q => path x q /\ fresh x N)
Subgoal 2.2 is:
(exists x p, F n1 n2 = path x p /\ name x /\ pname p) \/
(exists x N, F n1 n2 = pi q\path N q => path x q /\ fresh x N)
Subgoal 3 is:
(exists x p, F n1 = path x p /\ name x /\ pname p) \/
(exists x N, F n1 = pi q\path N q => path x q /\ fresh x N)
ctx2_mem_D < search.
Subgoal 2.2:
Variables: F D1 G1
IH : forall G D F, ctx2 G D * -> member F D ->
(exists x p, F = path x p /\ name x /\ pname p) \/
(exists x N, F = pi q\path N q => path x q /\ fresh x N)
H3 : ctx2 G1 D1 *
H4 : member (F n1 n2) D1
============================
(exists x p, F n1 n2 = path x p /\ name x /\ pname p) \/
(exists x N, F n1 n2 = pi q\path N q => path x q /\ fresh x N)
Subgoal 3 is:
(exists x p, F n1 = path x p /\ name x /\ pname p) \/
(exists x N, F n1 = pi q\path N q => path x q /\ fresh x N)
ctx2_mem_D < apply IH to H3 H4.
Subgoal 2.2:
Variables: F D1 G1
IH : forall G D F, ctx2 G D * -> member F D ->
(exists x p, F = path x p /\ name x /\ pname p) \/
(exists x N, F = pi q\path N q => path x q /\ fresh x N)
H3 : ctx2 G1 D1 *
H4 : member (F n1 n2) D1
H5 : (exists x p, F n1 n2 = path x p /\ name x /\ pname p) \/
(exists x N, F n1 n2 = pi q\path N q => path x q /\ fresh x N)
============================
(exists x p, F n1 n2 = path x p /\ name x /\ pname p) \/
(exists x N, F n1 n2 = pi q\path N q => path x q /\ fresh x N)
Subgoal 3 is:
(exists x p, F n1 = path x p /\ name x /\ pname p) \/
(exists x N, F n1 = pi q\path N q => path x q /\ fresh x N)
ctx2_mem_D < case H5.
Subgoal 2.2.1:
Variables: D1 G1 x p
IH : forall G D F, ctx2 G D * -> member F D ->
(exists x p, F = path x p /\ name x /\ pname p) \/
(exists x N, F = pi q\path N q => path x q /\ fresh x N)
H3 : ctx2 G1 D1 *
H4 : member (path (x n1) (p n2)) D1
H6 : name (x n1)
H7 : pname (p n2)
============================
(exists x1 p1, path (x n1) (p n2) = path x1 p1 /\ name x1 /\ pname p1) \/
(exists x1 N, path (x n1) (p n2) = pi q\path N q => path x1 q /\
fresh x1 N)
Subgoal 2.2.2 is:
(exists x1 p, pi q\path (N n1) q => path (x n1) q = path x1 p /\ name x1 /\
pname p) \/
(exists x1 N1, pi q\path (N n1) q => path (x n1) q =
pi q\path N1 q => path x1 q /\ fresh x1 N1)
Subgoal 3 is:
(exists x p, F n1 = path x p /\ name x /\ pname p) \/
(exists x N, F n1 = pi q\path N q => path x q /\ fresh x N)
ctx2_mem_D < search.
Subgoal 2.2.2:
Variables: D1 G1 x N
IH : forall G D F, ctx2 G D * -> member F D ->
(exists x p, F = path x p /\ name x /\ pname p) \/
(exists x N, F = pi q\path N q => path x q /\ fresh x N)
H3 : ctx2 G1 D1 *
H4 : member (pi q\path (N n1) q => path (x n1) q) D1
H6 : fresh (x n1) (N n1)
============================
(exists x1 p, pi q\path (N n1) q => path (x n1) q = path x1 p /\ name x1 /\
pname p) \/
(exists x1 N1, pi q\path (N n1) q => path (x n1) q =
pi q\path N1 q => path x1 q /\ fresh x1 N1)
Subgoal 3 is:
(exists x p, F n1 = path x p /\ name x /\ pname p) \/
(exists x N, F n1 = pi q\path N q => path x q /\ fresh x N)
ctx2_mem_D < search.
Subgoal 3:
Variables: F D1 N G1
IH : forall G D F, ctx2 G D * -> member F D ->
(exists x p, F = path x p /\ name x /\ pname p) \/
(exists x N, F = pi q\path N q => path x q /\ fresh x N)
H2 : member (F n1) ((pi q\path N q => path n1 q) :: D1)
H3 : ctx2 G1 D1 *
============================
(exists x p, F n1 = path x p /\ name x /\ pname p) \/
(exists x N, F n1 = pi q\path N q => path x q /\ fresh x N)
ctx2_mem_D < case H2.
Subgoal 3.1:
Variables: D1 N G1
IH : forall G D F, ctx2 G D * -> member F D ->
(exists x p, F = path x p /\ name x /\ pname p) \/
(exists x N, F = pi q\path N q => path x q /\ fresh x N)
H3 : ctx2 G1 D1 *
============================
(exists x p, pi q\path N q => path n1 q = path x p /\ name x /\ pname p) \/
(exists x N1, pi q\path N q => path n1 q = pi q\path N1 q => path x q /\
fresh x N1)
Subgoal 3.2 is:
(exists x p, F n1 = path x p /\ name x /\ pname p) \/
(exists x N, F n1 = pi q\path N q => path x q /\ fresh x N)
ctx2_mem_D < search.
Subgoal 3.2:
Variables: F D1 N G1
IH : forall G D F, ctx2 G D * -> member F D ->
(exists x p, F = path x p /\ name x /\ pname p) \/
(exists x N, F = pi q\path N q => path x q /\ fresh x N)
H3 : ctx2 G1 D1 *
H4 : member (F n1) D1
============================
(exists x p, F n1 = path x p /\ name x /\ pname p) \/
(exists x N, F n1 = pi q\path N q => path x q /\ fresh x N)
ctx2_mem_D < apply IH to H3 H4.
Subgoal 3.2:
Variables: F D1 N G1
IH : forall G D F, ctx2 G D * -> member F D ->
(exists x p, F = path x p /\ name x /\ pname p) \/
(exists x N, F = pi q\path N q => path x q /\ fresh x N)
H3 : ctx2 G1 D1 *
H4 : member (F n1) D1
H5 : (exists x p, F n1 = path x p /\ name x /\ pname p) \/
(exists x N, F n1 = pi q\path N q => path x q /\ fresh x N)
============================
(exists x p, F n1 = path x p /\ name x /\ pname p) \/
(exists x N, F n1 = pi q\path N q => path x q /\ fresh x N)
ctx2_mem_D < case H5.
Subgoal 3.2.1:
Variables: D1 N G1 x p
IH : forall G D F, ctx2 G D * -> member F D ->
(exists x p, F = path x p /\ name x /\ pname p) \/
(exists x N, F = pi q\path N q => path x q /\ fresh x N)
H3 : ctx2 G1 D1 *
H4 : member (path (x n1) p) D1
H6 : name (x n1)
H7 : pname p
============================
(exists x1 p1, path (x n1) p = path x1 p1 /\ name x1 /\ pname p1) \/
(exists x1 N, path (x n1) p = pi q\path N q => path x1 q /\ fresh x1 N)
Subgoal 3.2.2 is:
(exists x1 p, pi q\path (N1 n1) q => path (x n1) q = path x1 p /\ name x1 /\
pname p) \/
(exists x1 N, pi q\path (N1 n1) q => path (x n1) q =
pi q\path N q => path x1 q /\ fresh x1 N)
ctx2_mem_D < search.
Subgoal 3.2.2:
Variables: D1 N G1 x N1
IH : forall G D F, ctx2 G D * -> member F D ->
(exists x p, F = path x p /\ name x /\ pname p) \/
(exists x N, F = pi q\path N q => path x q /\ fresh x N)
H3 : ctx2 G1 D1 *
H4 : member (pi q\path (N1 n1) q => path (x n1) q) D1
H6 : fresh (x n1) (N1 n1)
============================
(exists x1 p, pi q\path (N1 n1) q => path (x n1) q = path x1 p /\ name x1 /\
pname p) \/
(exists x1 N, pi q\path (N1 n1) q => path (x n1) q =
pi q\path N q => path x1 q /\ fresh x1 N)
ctx2_mem_D < search.
Proof completed.
Abella < Theorem ctx2_uniform :
forall G D X, nabla n, ctx2 (G n) (D n) ->
member (pi u\bred X u => bred n u) (G n) ->
member (pi q\path X q => path n q) (D n).
============================
forall G D X, nabla n, ctx2 (G n) (D n) ->
member (pi u\bred X u => bred n u) (G n) ->
member (pi q\path X q => path n q) (D n)
ctx2_uniform < induction on 1.
IH : forall G D X, nabla n, ctx2 (G n) (D n) * ->
member (pi u\bred X u => bred n u) (G n) ->
member (pi q\path X q => path n q) (D n)
============================
forall G D X, nabla n, ctx2 (G n) (D n) @ ->
member (pi u\bred X u => bred n u) (G n) ->
member (pi q\path X q => path n q) (D n)
ctx2_uniform < intros.
Variables: G D X
IH : forall G D X, nabla n, ctx2 (G n) (D n) * ->
member (pi u\bred X u => bred n u) (G n) ->
member (pi q\path X q => path n q) (D n)
H1 : ctx2 (G n1) (D n1) @
H2 : member (pi u\bred X u => bred n1 u) (G n1)
============================
member (pi q\path X q => path n1 q) (D n1)
ctx2_uniform < case H1.
Subgoal 1:
Variables: X
IH : forall G D X, nabla n, ctx2 (G n) (D n) * ->
member (pi u\bred X u => bred n u) (G n) ->
member (pi q\path X q => path n q) (D n)
H2 : member (pi u\bred X u => bred n1 u) nil
============================
member (pi q\path X q => path n1 q) nil
Subgoal 2 is:
member (pi q\path (X n2) q => path n1 q) (path n2 n3 :: D1 n1)
Subgoal 3 is:
member (pi q\path X q => path n1 q) (path n1 n2 :: D1)
Subgoal 4 is:
member (pi q\path (X n2) q => path n1 q)
((pi q\path (N n1) q => path n2 q) :: D1 n1)
Subgoal 5 is:
member (pi q\path X q => path n1 q) ((pi q\path N q => path n1 q) :: D1)
ctx2_uniform < case H2.
Subgoal 2:
Variables: X D1 G1
IH : forall G D X, nabla n, ctx2 (G n) (D n) * ->
member (pi u\bred X u => bred n u) (G n) ->
member (pi q\path X q => path n q) (D n)
H2 : member (pi u\bred (X n2) u => bred n1 u) (bred n2 n2 :: G1 n1)
H3 : ctx2 (G1 n1) (D1 n1) *
============================
member (pi q\path (X n2) q => path n1 q) (path n2 n3 :: D1 n1)
Subgoal 3 is:
member (pi q\path X q => path n1 q) (path n1 n2 :: D1)
Subgoal 4 is:
member (pi q\path (X n2) q => path n1 q)
((pi q\path (N n1) q => path n2 q) :: D1 n1)
Subgoal 5 is:
member (pi q\path X q => path n1 q) ((pi q\path N q => path n1 q) :: D1)
ctx2_uniform < case H2.
Subgoal 2:
Variables: X D1 G1
IH : forall G D X, nabla n, ctx2 (G n) (D n) * ->
member (pi u\bred X u => bred n u) (G n) ->
member (pi q\path X q => path n q) (D n)
H3 : ctx2 (G1 n1) (D1 n1) *
H4 : member (pi u\bred (X n2) u => bred n1 u) (G1 n1)
============================
member (pi q\path (X n2) q => path n1 q) (path n2 n3 :: D1 n1)
Subgoal 3 is:
member (pi q\path X q => path n1 q) (path n1 n2 :: D1)
Subgoal 4 is:
member (pi q\path (X n2) q => path n1 q)
((pi q\path (N n1) q => path n2 q) :: D1 n1)
Subgoal 5 is:
member (pi q\path X q => path n1 q) ((pi q\path N q => path n1 q) :: D1)
ctx2_uniform < apply IH to H3 H4.
Subgoal 2:
Variables: X D1 G1
IH : forall G D X, nabla n, ctx2 (G n) (D n) * ->
member (pi u\bred X u => bred n u) (G n) ->
member (pi q\path X q => path n q) (D n)
H3 : ctx2 (G1 n1) (D1 n1) *
H4 : member (pi u\bred (X n2) u => bred n1 u) (G1 n1)
H5 : member (pi q\path (X n2) q => path n1 q) (D1 n1)
============================
member (pi q\path (X n2) q => path n1 q) (path n2 n3 :: D1 n1)
Subgoal 3 is:
member (pi q\path X q => path n1 q) (path n1 n2 :: D1)
Subgoal 4 is:
member (pi q\path (X n2) q => path n1 q)
((pi q\path (N n1) q => path n2 q) :: D1 n1)
Subgoal 5 is:
member (pi q\path X q => path n1 q) ((pi q\path N q => path n1 q) :: D1)
ctx2_uniform < search.
Subgoal 3:
Variables: X D1 G1
IH : forall G D X, nabla n, ctx2 (G n) (D n) * ->
member (pi u\bred X u => bred n u) (G n) ->
member (pi q\path X q => path n q) (D n)
H2 : member (pi u\bred X u => bred n1 u) (bred n1 n1 :: G1)
H3 : ctx2 G1 D1 *
============================
member (pi q\path X q => path n1 q) (path n1 n2 :: D1)
Subgoal 4 is:
member (pi q\path (X n2) q => path n1 q)
((pi q\path (N n1) q => path n2 q) :: D1 n1)
Subgoal 5 is:
member (pi q\path X q => path n1 q) ((pi q\path N q => path n1 q) :: D1)
ctx2_uniform < case H2.
Subgoal 3:
Variables: X D1 G1
IH : forall G D X, nabla n, ctx2 (G n) (D n) * ->
member (pi u\bred X u => bred n u) (G n) ->
member (pi q\path X q => path n q) (D n)
H3 : ctx2 G1 D1 *
H4 : member (pi u\bred X u => bred n1 u) G1
============================
member (pi q\path X q => path n1 q) (path n1 n2 :: D1)
Subgoal 4 is:
member (pi q\path (X n2) q => path n1 q)
((pi q\path (N n1) q => path n2 q) :: D1 n1)
Subgoal 5 is:
member (pi q\path X q => path n1 q) ((pi q\path N q => path n1 q) :: D1)
ctx2_uniform < apply IH to H3 H4.
Subgoal 3:
Variables: X D1 G1
IH : forall G D X, nabla n, ctx2 (G n) (D n) * ->
member (pi u\bred X u => bred n u) (G n) ->
member (pi q\path X q => path n q) (D n)
H3 : ctx2 G1 D1 *
H4 : member (pi u\bred X u => bred n1 u) G1
H5 : member (pi q\path X q => path n1 q) D1
============================
member (pi q\path X q => path n1 q) (path n1 n2 :: D1)
Subgoal 4 is:
member (pi q\path (X n2) q => path n1 q)
((pi q\path (N n1) q => path n2 q) :: D1 n1)
Subgoal 5 is:
member (pi q\path X q => path n1 q) ((pi q\path N q => path n1 q) :: D1)
ctx2_uniform < search.
Subgoal 4:
Variables: X D1 N G1
IH : forall G D X, nabla n, ctx2 (G n) (D n) * ->
member (pi u\bred X u => bred n u) (G n) ->
member (pi q\path X q => path n q) (D n)
H2 : member (pi u\bred (X n2) u => bred n1 u)
((pi u\bred (N n1) u => bred n2 u) :: G1 n1)
H3 : ctx2 (G1 n1) (D1 n1) *
============================
member (pi q\path (X n2) q => path n1 q)
((pi q\path (N n1) q => path n2 q) :: D1 n1)
Subgoal 5 is:
member (pi q\path X q => path n1 q) ((pi q\path N q => path n1 q) :: D1)
ctx2_uniform < case H2.
Subgoal 4:
Variables: X D1 N G1
IH : forall G D X, nabla n, ctx2 (G n) (D n) * ->
member (pi u\bred X u => bred n u) (G n) ->
member (pi q\path X q => path n q) (D n)
H3 : ctx2 (G1 n1) (D1 n1) *
H4 : member (pi u\bred (X n2) u => bred n1 u) (G1 n1)
============================
member (pi q\path (X n2) q => path n1 q)
((pi q\path (N n1) q => path n2 q) :: D1 n1)
Subgoal 5 is:
member (pi q\path X q => path n1 q) ((pi q\path N q => path n1 q) :: D1)
ctx2_uniform < apply IH to H3 H4.
Subgoal 4:
Variables: X D1 N G1
IH : forall G D X, nabla n, ctx2 (G n) (D n) * ->
member (pi u\bred X u => bred n u) (G n) ->
member (pi q\path X q => path n q) (D n)
H3 : ctx2 (G1 n1) (D1 n1) *
H4 : member (pi u\bred (X n2) u => bred n1 u) (G1 n1)
H5 : member (pi q\path (X n2) q => path n1 q) (D1 n1)
============================
member (pi q\path (X n2) q => path n1 q)
((pi q\path (N n1) q => path n2 q) :: D1 n1)
Subgoal 5 is:
member (pi q\path X q => path n1 q) ((pi q\path N q => path n1 q) :: D1)
ctx2_uniform < search.
Subgoal 5:
Variables: X D1 N G1
IH : forall G D X, nabla n, ctx2 (G n) (D n) * ->
member (pi u\bred X u => bred n u) (G n) ->
member (pi q\path X q => path n q) (D n)
H2 : member (pi u\bred X u => bred n1 u) ((pi u\bred N u => bred n1 u) :: G1)
H3 : ctx2 G1 D1 *
============================
member (pi q\path X q => path n1 q) ((pi q\path N q => path n1 q) :: D1)
ctx2_uniform < case H2.
Subgoal 5.1:
Variables: D1 N G1
IH : forall G D X, nabla n, ctx2 (G n) (D n) * ->
member (pi u\bred X u => bred n u) (G n) ->
member (pi q\path X q => path n q) (D n)
H3 : ctx2 G1 D1 *
============================
member (pi q\path N q => path n1 q) ((pi q\path N q => path n1 q) :: D1)
Subgoal 5.2 is:
member (pi q\path X q => path n1 q) ((pi q\path N q => path n1 q) :: D1)
ctx2_uniform < search.
Subgoal 5.2:
Variables: X D1 N G1
IH : forall G D X, nabla n, ctx2 (G n) (D n) * ->
member (pi u\bred X u => bred n u) (G n) ->
member (pi q\path X q => path n q) (D n)
H3 : ctx2 G1 D1 *
H4 : member (pi u\bred X u => bred n1 u) G1
============================
member (pi q\path X q => path n1 q) ((pi q\path N q => path n1 q) :: D1)
ctx2_uniform < apply IH to H3 H4.
Subgoal 5.2:
Variables: X D1 N G1
IH : forall G D X, nabla n, ctx2 (G n) (D n) * ->
member (pi u\bred X u => bred n u) (G n) ->
member (pi q\path X q => path n q) (D n)
H3 : ctx2 G1 D1 *
H4 : member (pi u\bred X u => bred n1 u) G1
H5 : member (pi q\path X q => path n1 q) D1
============================
member (pi q\path X q => path n1 q) ((pi q\path N q => path n1 q) :: D1)
ctx2_uniform < search.
Proof completed.
Abella < Theorem member_prune_D :
forall G D E, nabla n, ctx2 G D -> member (E n) D -> (exists F, E = x\F).
============================
forall G D E, nabla n, ctx2 G D -> member (E n) D -> (exists F, E = x\F)
member_prune_D < induction on 1.
IH : forall G D E, nabla n, ctx2 G D * -> member (E n) D ->
(exists F, E = x\F)
============================
forall G D E, nabla n, ctx2 G D @ -> member (E n) D -> (exists F, E = x\F)
member_prune_D < intros.
Variables: G D E
IH : forall G D E, nabla n, ctx2 G D * -> member (E n) D ->
(exists F, E = x\F)
H1 : ctx2 G D @
H2 : member (E n1) D
============================
exists F, E = x\F
member_prune_D < case H1.
Subgoal 1:
Variables: E
IH : forall G D E, nabla n, ctx2 G D * -> member (E n) D ->
(exists F, E = x\F)
H2 : member (E n1) nil
============================
exists F, E = x\F
Subgoal 2 is:
exists F, E n2 n3 = x\F
Subgoal 3 is:
exists F, E n2 = x\F
member_prune_D < case H2.
Subgoal 2:
Variables: E D1 G1
IH : forall G D E, nabla n, ctx2 G D * -> member (E n) D ->
(exists F, E = x\F)
H2 : member (E n2 n3 n1) (path n2 n3 :: D1)
H3 : ctx2 G1 D1 *
============================
exists F, E n2 n3 = x\F
Subgoal 3 is:
exists F, E n2 = x\F
member_prune_D < case H2.
Subgoal 2.1:
Variables: D1 G1
IH : forall G D E, nabla n, ctx2 G D * -> member (E n) D ->
(exists F, E = x\F)
H3 : ctx2 G1 D1 *
============================
exists F, z3\path n2 n3 = x\F
Subgoal 2.2 is:
exists F, E n2 n3 = x\F
Subgoal 3 is:
exists F, E n2 = x\F
member_prune_D < search.
Subgoal 2.2:
Variables: E D1 G1
IH : forall G D E, nabla n, ctx2 G D * -> member (E n) D ->
(exists F, E = x\F)
H3 : ctx2 G1 D1 *
H4 : member (E n2 n3 n1) D1
============================
exists F, E n2 n3 = x\F
Subgoal 3 is:
exists F, E n2 = x\F
member_prune_D < apply IH to H3 H4.
Subgoal 2.2:
Variables: D1 G1 F
IH : forall G D E, nabla n, ctx2 G D * -> member (E n) D ->
(exists F, E = x\F)
H3 : ctx2 G1 D1 *
H4 : member (F n1 n3) D1
============================
exists F1, z3\F z3 n3 = x\F1
Subgoal 3 is:
exists F, E n2 = x\F
member_prune_D < apply IH to H3 H4.
Subgoal 2.2:
Variables: D1 G1 F1
IH : forall G D E, nabla n, ctx2 G D * -> member (E n) D ->
(exists F, E = x\F)
H3 : ctx2 G1 D1 *
H4 : member (F1 n3) D1
============================
exists F2, z3\F1 n3 = x\F2
Subgoal 3 is:
exists F, E n2 = x\F
member_prune_D < search.
Subgoal 3:
Variables: E D1 N G1
IH : forall G D E, nabla n, ctx2 G D * -> member (E n) D ->
(exists F, E = x\F)
H2 : member (E n2 n1) ((pi q\path N q => path n2 q) :: D1)
H3 : ctx2 G1 D1 *
============================
exists F, E n2 = x\F
member_prune_D < case H2.
Subgoal 3.1:
Variables: D1 N G1
IH : forall G D E, nabla n, ctx2 G D * -> member (E n) D ->
(exists F, E = x\F)
H3 : ctx2 G1 D1 *
============================
exists F, z2\pi q\path N q => path n2 q = x\F
Subgoal 3.2 is:
exists F, E n2 = x\F
member_prune_D < search.
Subgoal 3.2:
Variables: E D1 N G1
IH : forall G D E, nabla n, ctx2 G D * -> member (E n) D ->
(exists F, E = x\F)
H3 : ctx2 G1 D1 *
H4 : member (E n2 n1) D1
============================
exists F, E n2 = x\F
member_prune_D < apply IH to H3 H4.
Subgoal 3.2:
Variables: D1 N G1 F
IH : forall G D E, nabla n, ctx2 G D * -> member (E n) D ->
(exists F, E = x\F)
H3 : ctx2 G1 D1 *
H4 : member (F n1) D1
============================
exists F1, z2\F z2 = x\F1
member_prune_D < apply IH to H3 H4.
Subgoal 3.2:
Variables: D1 N G1 F1
IH : forall G D E, nabla n, ctx2 G D * -> member (E n) D ->
(exists F, E = x\F)
H3 : ctx2 G1 D1 *
H4 : member F1 D1
============================
exists F2, z2\F1 = x\F2
member_prune_D < search.
Proof completed.
Abella < Theorem member_D_determinate :
forall G D X Y, nabla n, ctx2 (G n) (D n) ->
member (pi q\path X q => path n q) (D n) ->
member (pi q\path Y q => path n q) (D n) -> X =
Y.
============================
forall G D X Y, nabla n, ctx2 (G n) (D n) ->
member (pi q\path X q => path n q) (D n) ->
member (pi q\path Y q => path n q) (D n) -> X =
Y
member_D_determinate < induction on 1.
IH : forall G D X Y, nabla n, ctx2 (G n) (D n) * ->
member (pi q\path X q => path n q) (D n) ->
member (pi q\path Y q => path n q) (D n) -> X =
Y
============================
forall G D X Y, nabla n, ctx2 (G n) (D n) @ ->
member (pi q\path X q => path n q) (D n) ->
member (pi q\path Y q => path n q) (D n) -> X =
Y
member_D_determinate < intros.
Variables: G D X Y
IH : forall G D X Y, nabla n, ctx2 (G n) (D n) * ->
member (pi q\path X q => path n q) (D n) ->
member (pi q\path Y q => path n q) (D n) -> X =
Y
H1 : ctx2 (G n1) (D n1) @
H2 : member (pi q\path X q => path n1 q) (D n1)
H3 : member (pi q\path Y q => path n1 q) (D n1)
============================
X = Y
member_D_determinate < case H1.
Subgoal 1:
Variables: X Y
IH : forall G D X Y, nabla n, ctx2 (G n) (D n) * ->
member (pi q\path X q => path n q) (D n) ->
member (pi q\path Y q => path n q) (D n) -> X =
Y
H2 : member (pi q\path X q => path n1 q) nil
H3 : member (pi q\path Y q => path n1 q) nil
============================
X = Y
Subgoal 2 is:
X n2 = Y n2
Subgoal 3 is:
X = Y
Subgoal 4 is:
X n2 = Y n2
Subgoal 5 is:
X = Y
member_D_determinate < case H2.
Subgoal 2:
Variables: X Y D1 G1
IH : forall G D X Y, nabla n, ctx2 (G n) (D n) * ->
member (pi q\path X q => path n q) (D n) ->
member (pi q\path Y q => path n q) (D n) -> X =
Y
H2 : member (pi q\path (X n2) q => path n1 q) (path n2 n3 :: D1 n1)
H3 : member (pi q\path (Y n2) q => path n1 q) (path n2 n3 :: D1 n1)
H4 : ctx2 (G1 n1) (D1 n1) *
============================
X n2 = Y n2
Subgoal 3 is:
X = Y
Subgoal 4 is:
X n2 = Y n2
Subgoal 5 is:
X = Y
member_D_determinate < case H2.
Subgoal 2:
Variables: X Y D1 G1
IH : forall G D X Y, nabla n, ctx2 (G n) (D n) * ->
member (pi q\path X q => path n q) (D n) ->
member (pi q\path Y q => path n q) (D n) -> X =
Y
H3 : member (pi q\path (Y n2) q => path n1 q) (path n2 n3 :: D1 n1)
H4 : ctx2 (G1 n1) (D1 n1) *
H5 : member (pi q\path (X n2) q => path n1 q) (D1 n1)
============================
X n2 = Y n2
Subgoal 3 is:
X = Y
Subgoal 4 is:
X n2 = Y n2
Subgoal 5 is:
X = Y
member_D_determinate < case H3.
Subgoal 2:
Variables: X Y D1 G1
IH : forall G D X Y, nabla n, ctx2 (G n) (D n) * ->
member (pi q\path X q => path n q) (D n) ->
member (pi q\path Y q => path n q) (D n) -> X =
Y
H4 : ctx2 (G1 n1) (D1 n1) *
H5 : member (pi q\path (X n2) q => path n1 q) (D1 n1)
H6 : member (pi q\path (Y n2) q => path n1 q) (D1 n1)
============================
X n2 = Y n2
Subgoal 3 is:
X = Y
Subgoal 4 is:
X n2 = Y n2
Subgoal 5 is:
X = Y
member_D_determinate < apply IH to H4 H5 H6.
Subgoal 2:
Variables: Y D1 G1
IH : forall G D X Y, nabla n, ctx2 (G n) (D n) * ->
member (pi q\path X q => path n q) (D n) ->
member (pi q\path Y q => path n q) (D n) -> X =
Y
H4 : ctx2 (G1 n1) (D1 n1) *
H5 : member (pi q\path (Y n2) q => path n1 q) (D1 n1)
H6 : member (pi q\path (Y n2) q => path n1 q) (D1 n1)
============================
Y n2 = Y n2
Subgoal 3 is:
X = Y
Subgoal 4 is:
X n2 = Y n2
Subgoal 5 is:
X = Y
member_D_determinate < search.
Subgoal 3:
Variables: X Y D1 G1
IH : forall G D X Y, nabla n, ctx2 (G n) (D n) * ->
member (pi q\path X q => path n q) (D n) ->
member (pi q\path Y q => path n q) (D n) -> X =
Y
H2 : member (pi q\path X q => path n1 q) (path n1 n2 :: D1)
H3 : member (pi q\path Y q => path n1 q) (path n1 n2 :: D1)
H4 : ctx2 G1 D1 *
============================
X = Y
Subgoal 4 is:
X n2 = Y n2
Subgoal 5 is:
X = Y
member_D_determinate < case H2.
Subgoal 3:
Variables: X Y D1 G1
IH : forall G D X Y, nabla n, ctx2 (G n) (D n) * ->
member (pi q\path X q => path n q) (D n) ->
member (pi q\path Y q => path n q) (D n) -> X =
Y
H3 : member (pi q\path Y q => path n1 q) (path n1 n2 :: D1)
H4 : ctx2 G1 D1 *
H5 : member (pi q\path X q => path n1 q) D1
============================
X = Y
Subgoal 4 is:
X n2 = Y n2
Subgoal 5 is:
X = Y
member_D_determinate < case H3.
Subgoal 3:
Variables: X Y D1 G1
IH : forall G D X Y, nabla n, ctx2 (G n) (D n) * ->
member (pi q\path X q => path n q) (D n) ->
member (pi q\path Y q => path n q) (D n) -> X =
Y
H4 : ctx2 G1 D1 *
H5 : member (pi q\path X q => path n1 q) D1
H6 : member (pi q\path Y q => path n1 q) D1
============================
X = Y
Subgoal 4 is:
X n2 = Y n2
Subgoal 5 is:
X = Y
member_D_determinate < apply IH to H4 H5 H6.
Subgoal 3:
Variables: Y D1 G1
IH : forall G D X Y, nabla n, ctx2 (G n) (D n) * ->
member (pi q\path X q => path n q) (D n) ->
member (pi q\path Y q => path n q) (D n) -> X =
Y
H4 : ctx2 G1 D1 *
H5 : member (pi q\path Y q => path n1 q) D1
H6 : member (pi q\path Y q => path n1 q) D1
============================
Y = Y
Subgoal 4 is:
X n2 = Y n2
Subgoal 5 is:
X = Y
member_D_determinate < search.
Subgoal 4:
Variables: X Y D1 N G1
IH : forall G D X Y, nabla n, ctx2 (G n) (D n) * ->
member (pi q\path X q => path n q) (D n) ->
member (pi q\path Y q => path n q) (D n) -> X =
Y
H2 : member (pi q\path (X n2) q => path n1 q)
((pi q\path (N n1) q => path n2 q) :: D1 n1)
H3 : member (pi q\path (Y n2) q => path n1 q)
((pi q\path (N n1) q => path n2 q) :: D1 n1)
H4 : ctx2 (G1 n1) (D1 n1) *
============================
X n2 = Y n2
Subgoal 5 is:
X = Y
member_D_determinate < case H2.
Subgoal 4:
Variables: X Y D1 N G1
IH : forall G D X Y, nabla n, ctx2 (G n) (D n) * ->
member (pi q\path X q => path n q) (D n) ->
member (pi q\path Y q => path n q) (D n) -> X =
Y
H3 : member (pi q\path (Y n2) q => path n1 q)
((pi q\path (N n1) q => path n2 q) :: D1 n1)
H4 : ctx2 (G1 n1) (D1 n1) *
H5 : member (pi q\path (X n2) q => path n1 q) (D1 n1)
============================
X n2 = Y n2
Subgoal 5 is:
X = Y
member_D_determinate < case H3.
Subgoal 4:
Variables: X Y D1 N G1
IH : forall G D X Y, nabla n, ctx2 (G n) (D n) * ->
member (pi q\path X q => path n q) (D n) ->
member (pi q\path Y q => path n q) (D n) -> X =
Y
H4 : ctx2 (G1 n1) (D1 n1) *
H5 : member (pi q\path (X n2) q => path n1 q) (D1 n1)
H6 : member (pi q\path (Y n2) q => path n1 q) (D1 n1)
============================
X n2 = Y n2
Subgoal 5 is:
X = Y
member_D_determinate < apply IH to H4 H5 H6.
Subgoal 4:
Variables: Y D1 N G1
IH : forall G D X Y, nabla n, ctx2 (G n) (D n) * ->
member (pi q\path X q => path n q) (D n) ->
member (pi q\path Y q => path n q) (D n) -> X =
Y
H4 : ctx2 (G1 n1) (D1 n1) *
H5 : member (pi q\path (Y n2) q => path n1 q) (D1 n1)
H6 : member (pi q\path (Y n2) q => path n1 q) (D1 n1)
============================
Y n2 = Y n2
Subgoal 5 is:
X = Y
member_D_determinate < search.
Subgoal 5:
Variables: X Y D1 N G1
IH : forall G D X Y, nabla n, ctx2 (G n) (D n) * ->
member (pi q\path X q => path n q) (D n) ->
member (pi q\path Y q => path n q) (D n) -> X =
Y
H2 : member (pi q\path X q => path n1 q) ((pi q\path N q => path n1 q) :: D1)
H3 : member (pi q\path Y q => path n1 q) ((pi q\path N q => path n1 q) :: D1)
H4 : ctx2 G1 D1 *
============================
X = Y
member_D_determinate < case H2.
Subgoal 5.1:
Variables: Y D1 N G1
IH : forall G D X Y, nabla n, ctx2 (G n) (D n) * ->
member (pi q\path X q => path n q) (D n) ->
member (pi q\path Y q => path n q) (D n) -> X =
Y
H3 : member (pi q\path Y q => path n1 q) ((pi q\path N q => path n1 q) :: D1)
H4 : ctx2 G1 D1 *
============================
N = Y
Subgoal 5.2 is:
X = Y
member_D_determinate < case H3.
Subgoal 5.1.1:
Variables: D1 N G1
IH : forall G D X Y, nabla n, ctx2 (G n) (D n) * ->
member (pi q\path X q => path n q) (D n) ->
member (pi q\path Y q => path n q) (D n) -> X =
Y
H4 : ctx2 G1 D1 *
============================
N = N
Subgoal 5.1.2 is:
N = Y
Subgoal 5.2 is:
X = Y
member_D_determinate < search.
Subgoal 5.1.2:
Variables: Y D1 N G1
IH : forall G D X Y, nabla n, ctx2 (G n) (D n) * ->
member (pi q\path X q => path n q) (D n) ->
member (pi q\path Y q => path n q) (D n) -> X =
Y
H4 : ctx2 G1 D1 *
H5 : member (pi q\path Y q => path n1 q) D1
============================
N = Y
Subgoal 5.2 is:
X = Y
member_D_determinate < apply member_prune_D to H4 H5.
Subgoal 5.2:
Variables: X Y D1 N G1
IH : forall G D X Y, nabla n, ctx2 (G n) (D n) * ->
member (pi q\path X q => path n q) (D n) ->
member (pi q\path Y q => path n q) (D n) -> X =
Y
H3 : member (pi q\path Y q => path n1 q) ((pi q\path N q => path n1 q) :: D1)
H4 : ctx2 G1 D1 *
H5 : member (pi q\path X q => path n1 q) D1
============================
X = Y
member_D_determinate < apply member_prune_D to H4 H5.
Proof completed.
Abella < Theorem member_D_discrim :
forall G D X P, nabla n, ctx2 (G n) (D n) ->
member (pi q\path X q => path n q) (D n) -> member (path n P) (D n) ->
false.
============================
forall G D X P, nabla n, ctx2 (G n) (D n) ->
member (pi q\path X q => path n q) (D n) -> member (path n P) (D n) ->
false
member_D_discrim < induction on 1.
IH : forall G D X P, nabla n, ctx2 (G n) (D n) * ->
member (pi q\path X q => path n q) (D n) -> member (path n P) (D n) ->
false
============================
forall G D X P, nabla n, ctx2 (G n) (D n) @ ->
member (pi q\path X q => path n q) (D n) -> member (path n P) (D n) ->
false
member_D_discrim < intros.
Variables: G D X P
IH : forall G D X P, nabla n, ctx2 (G n) (D n) * ->
member (pi q\path X q => path n q) (D n) -> member (path n P) (D n) ->
false
H1 : ctx2 (G n1) (D n1) @
H2 : member (pi q\path X q => path n1 q) (D n1)
H3 : member (path n1 P) (D n1)
============================
false
member_D_discrim < case H1.
Subgoal 1:
Variables: X P
IH : forall G D X P, nabla n, ctx2 (G n) (D n) * ->
member (pi q\path X q => path n q) (D n) -> member (path n P) (D n) ->
false
H2 : member (pi q\path X q => path n1 q) nil
H3 : member (path n1 P) nil
============================
false
Subgoal 2 is:
false
Subgoal 3 is:
false
Subgoal 4 is:
false
Subgoal 5 is:
false
member_D_discrim < case H2.
Subgoal 2:
Variables: X P D1 G1
IH : forall G D X P, nabla n, ctx2 (G n) (D n) * ->
member (pi q\path X q => path n q) (D n) -> member (path n P) (D n) ->
false
H2 : member (pi q\path (X n2) q => path n1 q) (path n2 n3 :: D1 n1)
H3 : member (path n1 (P n3)) (path n2 n3 :: D1 n1)
H4 : ctx2 (G1 n1) (D1 n1) *
============================
false
Subgoal 3 is:
false
Subgoal 4 is:
false
Subgoal 5 is:
false
member_D_discrim < case H2.
Subgoal 2:
Variables: X P D1 G1
IH : forall G D X P, nabla n, ctx2 (G n) (D n) * ->
member (pi q\path X q => path n q) (D n) -> member (path n P) (D n) ->
false
H3 : member (path n1 (P n3)) (path n2 n3 :: D1 n1)
H4 : ctx2 (G1 n1) (D1 n1) *
H5 : member (pi q\path (X n2) q => path n1 q) (D1 n1)
============================
false
Subgoal 3 is:
false
Subgoal 4 is:
false
Subgoal 5 is:
false
member_D_discrim < case H3.
Subgoal 2:
Variables: X P D1 G1
IH : forall G D X P, nabla n, ctx2 (G n) (D n) * ->
member (pi q\path X q => path n q) (D n) -> member (path n P) (D n) ->
false
H4 : ctx2 (G1 n1) (D1 n1) *
H5 : member (pi q\path (X n2) q => path n1 q) (D1 n1)
H6 : member (path n1 (P n3)) (D1 n1)
============================
false
Subgoal 3 is:
false
Subgoal 4 is:
false
Subgoal 5 is:
false
member_D_discrim < apply IH to H4 H5 H6.
Subgoal 3:
Variables: X P D1 G1
IH : forall G D X P, nabla n, ctx2 (G n) (D n) * ->
member (pi q\path X q => path n q) (D n) -> member (path n P) (D n) ->
false
H2 : member (pi q\path X q => path n1 q) (path n1 n2 :: D1)
H3 : member (path n1 (P n2)) (path n1 n2 :: D1)
H4 : ctx2 G1 D1 *
============================
false
Subgoal 4 is:
false
Subgoal 5 is:
false
member_D_discrim < case H2.
Subgoal 3:
Variables: X P D1 G1
IH : forall G D X P, nabla n, ctx2 (G n) (D n) * ->
member (pi q\path X q => path n q) (D n) -> member (path n P) (D n) ->
false
H3 : member (path n1 (P n2)) (path n1 n2 :: D1)
H4 : ctx2 G1 D1 *
H5 : member (pi q\path X q => path n1 q) D1
============================
false
Subgoal 4 is:
false
Subgoal 5 is:
false
member_D_discrim < apply member_prune_D to H4 H5.
Subgoal 4:
Variables: X P D1 N G1
IH : forall G D X P, nabla n, ctx2 (G n) (D n) * ->
member (pi q\path X q => path n q) (D n) -> member (path n P) (D n) ->
false
H2 : member (pi q\path (X n2) q => path n1 q)
((pi q\path (N n1) q => path n2 q) :: D1 n1)
H3 : member (path n1 P) ((pi q\path (N n1) q => path n2 q) :: D1 n1)
H4 : ctx2 (G1 n1) (D1 n1) *
============================
false
Subgoal 5 is:
false
member_D_discrim < case H2.
Subgoal 4:
Variables: X P D1 N G1
IH : forall G D X P, nabla n, ctx2 (G n) (D n) * ->
member (pi q\path X q => path n q) (D n) -> member (path n P) (D n) ->
false
H3 : member (path n1 P) ((pi q\path (N n1) q => path n2 q) :: D1 n1)
H4 : ctx2 (G1 n1) (D1 n1) *
H5 : member (pi q\path (X n2) q => path n1 q) (D1 n1)
============================
false
Subgoal 5 is:
false
member_D_discrim < case H3.
Subgoal 4:
Variables: X P D1 N G1
IH : forall G D X P, nabla n, ctx2 (G n) (D n) * ->
member (pi q\path X q => path n q) (D n) -> member (path n P) (D n) ->
false
H4 : ctx2 (G1 n1) (D1 n1) *
H5 : member (pi q\path (X n2) q => path n1 q) (D1 n1)
H6 : member (path n1 P) (D1 n1)
============================
false
Subgoal 5 is:
false
member_D_discrim < apply IH to H4 H5 H6.
Subgoal 5:
Variables: X P D1 N G1
IH : forall G D X P, nabla n, ctx2 (G n) (D n) * ->
member (pi q\path X q => path n q) (D n) -> member (path n P) (D n) ->
false
H2 : member (pi q\path X q => path n1 q) ((pi q\path N q => path n1 q) :: D1)
H3 : member (path n1 P) ((pi q\path N q => path n1 q) :: D1)
H4 : ctx2 G1 D1 *
============================
false
member_D_discrim < case H3.
Subgoal 5:
Variables: X P D1 N G1
IH : forall G D X P, nabla n, ctx2 (G n) (D n) * ->
member (pi q\path X q => path n q) (D n) -> member (path n P) (D n) ->
false
H2 : member (pi q\path X q => path n1 q) ((pi q\path N q => path n1 q) :: D1)
H4 : ctx2 G1 D1 *
H5 : member (path n1 P) D1
============================
false
member_D_discrim < apply member_prune_D to H4 H5.
Proof completed.
Abella < Theorem jump_D_invert :
forall G D X P, nabla n, ctx2 (G n) (D n) ->
member (pi q\path X q => path n q) (D n) -> {D n |- path n P} ->
{D n |- path X P}.
============================
forall G D X P, nabla n, ctx2 (G n) (D n) ->
member (pi q\path X q => path n q) (D n) -> {D n |- path n P} ->
{D n |- path X P}
jump_D_invert < intros.
Variables: G D X P
H1 : ctx2 (G n1) (D n1)
H2 : member (pi q\path X q => path n1 q) (D n1)
H3 : {D n1 |- path n1 P}
============================
{D n1 |- path X P}
jump_D_invert < case H3.
Variables: G D X P F
H1 : ctx2 (G n1) (D n1)
H2 : member (pi q\path X q => path n1 q) (D n1)
H4 : {D n1, [F n1] |- path n1 P}
H5 : member (F n1) (D n1)
============================
{D n1 |- path X P}
jump_D_invert < apply ctx2_mem_D to H1 H5.
Variables: G D X P F
H1 : ctx2 (G n1) (D n1)
H2 : member (pi q\path X q => path n1 q) (D n1)
H4 : {D n1, [F n1] |- path n1 P}
H5 : member (F n1) (D n1)
H6 : (exists x p, F n1 = path x p /\ name x /\ pname p) \/
(exists x N, F n1 = pi q\path N q => path x q /\ fresh x N)
============================
{D n1 |- path X P}
jump_D_invert < case H6.
Subgoal 1:
Variables: G D X P x p
H1 : ctx2 (G n1) (D n1)
H2 : member (pi q\path X q => path n1 q) (D n1)
H4 : {D n1, [path (x n1) p] |- path n1 P}
H5 : member (path (x n1) p) (D n1)
H7 : name (x n1)
H8 : pname p
============================
{D n1 |- path X P}
Subgoal 2 is:
{D n1 |- path X P}
jump_D_invert < case H4.
Subgoal 1:
Variables: G D X P
H1 : ctx2 (G n1) (D n1)
H2 : member (pi q\path X q => path n1 q) (D n1)
H5 : member (path n1 P) (D n1)
H7 : name n1
H8 : pname P
============================
{D n1 |- path X P}
Subgoal 2 is:
{D n1 |- path X P}
jump_D_invert < apply member_D_discrim to H1 H2 H5.
Subgoal 2:
Variables: G D X P x N
H1 : ctx2 (G n1) (D n1)
H2 : member (pi q\path X q => path n1 q) (D n1)
H4 : {D n1, [pi q\path (N n1) q => path (x n1) q] |- path n1 P}
H5 : member (pi q\path (N n1) q => path (x n1) q) (D n1)
H7 : fresh (x n1) (N n1)
============================
{D n1 |- path X P}
jump_D_invert < case H4.
Subgoal 2:
Variables: G D X P N
H1 : ctx2 (G n1) (D n1)
H2 : member (pi q\path X q => path n1 q) (D n1)
H5 : member (pi q\path (N n1) q => path n1 q) (D n1)
H7 : fresh n1 (N n1)
H8 : {D n1 |- path (N n1) P}
============================
{D n1 |- path X P}
jump_D_invert < case H7.
Subgoal 2:
Variables: G D X P X1
H1 : ctx2 (G n1) (D n1)
H2 : member (pi q\path X q => path n1 q) (D n1)
H5 : member (pi q\path X1 q => path n1 q) (D n1)
H8 : {D n1 |- path X1 P}
============================
{D n1 |- path X P}
jump_D_invert < apply member_D_determinate to H1 H2 H5.
Subgoal 2:
Variables: G D P X1
H1 : ctx2 (G n1) (D n1)
H2 : member (pi q\path X1 q => path n1 q) (D n1)
H5 : member (pi q\path X1 q => path n1 q) (D n1)
H8 : {D n1 |- path X1 P}
============================
{D n1 |- path X1 P}
jump_D_invert < search.
Proof completed.
Abella < Theorem bred_ltr :
forall G D M N P, ctx2 G D -> {G |- bred M N} -> {D |- path M P} ->
{D |- path N P}.
============================
forall G D M N P, ctx2 G D -> {G |- bred M N} -> {D |- path M P} ->
{D |- path N P}
bred_ltr < induction on 2.
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
============================
forall G D M N P, ctx2 G D -> {G |- bred M N}@ -> {D |- path M P} ->
{D |- path N P}
bred_ltr < intros.
Variables: G D M N P
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 G D
H2 : {G |- bred M N}@
H3 : {D |- path M P}
============================
{D |- path N P}
bred_ltr < case H2 (keep).
Subgoal 1:
Variables: G D P U M1
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 G D
H2 : {G |- bred (abs M1) (abs U)}@
H3 : {D |- path (abs M1) P}
H4 : {G, bred n1 n1 |- bred (M1 n1) (U n1)}*
============================
{D |- path (abs U) P}
Subgoal 2 is:
{D |- path (app U V) P}
Subgoal 3 is:
{D |- path N P}
Subgoal 4 is:
{D |- path N P}
bred_ltr < case H3.
Subgoal 1.1:
Variables: G D U M1 P1
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 G D
H2 : {G |- bred (abs M1) (abs U)}@
H4 : {G, bred n1 n1 |- bred (M1 n1) (U n1)}*
H5 : {D, path n1 n2 |- path (M1 n1) (P1 n2)}
============================
{D |- path (abs U) (bnd P1)}
Subgoal 1.2 is:
{D |- path (abs U) P}
Subgoal 2 is:
{D |- path (app U V) P}
Subgoal 3 is:
{D |- path N P}
Subgoal 4 is:
{D |- path N P}
bred_ltr < apply IH to _ H4 H5.
Subgoal 1.1:
Variables: G D U M1 P1
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 G D
H2 : {G |- bred (abs M1) (abs U)}@
H4 : {G, bred n1 n1 |- bred (M1 n1) (U n1)}*
H5 : {D, path n1 n2 |- path (M1 n1) (P1 n2)}
H6 : {D, path n1 n2 |- path (U n1) (P1 n2)}
============================
{D |- path (abs U) (bnd P1)}
Subgoal 1.2 is:
{D |- path (abs U) P}
Subgoal 2 is:
{D |- path (app U V) P}
Subgoal 3 is:
{D |- path N P}
Subgoal 4 is:
{D |- path N P}
bred_ltr < search.
Subgoal 1.2:
Variables: G D P U M1 F
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 G D
H2 : {G |- bred (abs M1) (abs U)}@
H4 : {G, bred n1 n1 |- bred (M1 n1) (U n1)}*
H5 : {D, [F] |- path (abs M1) P}
H6 : member F D
============================
{D |- path (abs U) P}
Subgoal 2 is:
{D |- path (app U V) P}
Subgoal 3 is:
{D |- path N P}
Subgoal 4 is:
{D |- path N P}
bred_ltr < apply ctx2_mem_D to H1 H6.
Subgoal 1.2:
Variables: G D P U M1 F
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 G D
H2 : {G |- bred (abs M1) (abs U)}@
H4 : {G, bred n1 n1 |- bred (M1 n1) (U n1)}*
H5 : {D, [F] |- path (abs M1) P}
H6 : member F D
H7 : (exists x p, F = path x p /\ name x /\ pname p) \/
(exists x N, F = pi q\path N q => path x q /\ fresh x N)
============================
{D |- path (abs U) P}
Subgoal 2 is:
{D |- path (app U V) P}
Subgoal 3 is:
{D |- path N P}
Subgoal 4 is:
{D |- path N P}
bred_ltr < case H7.
Subgoal 1.2.1:
Variables: G D P U M1 x p
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 G D
H2 : {G |- bred (abs M1) (abs U)}@
H4 : {G, bred n1 n1 |- bred (M1 n1) (U n1)}*
H5 : {D, [path x p] |- path (abs M1) P}
H6 : member (path x p) D
H8 : name x
H9 : pname p
============================
{D |- path (abs U) P}
Subgoal 1.2.2 is:
{D |- path (abs U) P}
Subgoal 2 is:
{D |- path (app U V) P}
Subgoal 3 is:
{D |- path N P}
Subgoal 4 is:
{D |- path N P}
bred_ltr < case H8.
Subgoal 1.2.1:
Variables: G D P U M1 p
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 (G n2) (D n2)
H2 : {G n2 |- bred (abs (M1 n2)) (abs (U n2))}@
H4 : {G n2, bred n1 n1 |- bred (M1 n2 n1) (U n2 n1)}*
H5 : {D n2, [path n2 p] |- path (abs (M1 n2)) P}
H6 : member (path n2 p) (D n2)
H9 : pname p
============================
{D n2 |- path (abs (U n2)) P}
Subgoal 1.2.2 is:
{D |- path (abs U) P}
Subgoal 2 is:
{D |- path (app U V) P}
Subgoal 3 is:
{D |- path N P}
Subgoal 4 is:
{D |- path N P}
bred_ltr < case H5.
Subgoal 1.2.2:
Variables: G D P U M1 x N1
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 G D
H2 : {G |- bred (abs M1) (abs U)}@
H4 : {G, bred n1 n1 |- bred (M1 n1) (U n1)}*
H5 : {D, [pi q\path N1 q => path x q] |- path (abs M1) P}
H6 : member (pi q\path N1 q => path x q) D
H8 : fresh x N1
============================
{D |- path (abs U) P}
Subgoal 2 is:
{D |- path (app U V) P}
Subgoal 3 is:
{D |- path N P}
Subgoal 4 is:
{D |- path N P}
bred_ltr < case H8.
Subgoal 1.2.2:
Variables: G D P U M1 X
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 (G n2) (D n2)
H2 : {G n2 |- bred (abs (M1 n2)) (abs (U n2))}@
H4 : {G n2, bred n1 n1 |- bred (M1 n2 n1) (U n2 n1)}*
H5 : {D n2, [pi q\path X q => path n2 q] |- path (abs (M1 n2)) P}
H6 : member (pi q\path X q => path n2 q) (D n2)
============================
{D n2 |- path (abs (U n2)) P}
Subgoal 2 is:
{D |- path (app U V) P}
Subgoal 3 is:
{D |- path N P}
Subgoal 4 is:
{D |- path N P}
bred_ltr < case H5.
Subgoal 2:
Variables: G D P V N1 U M1
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 G D
H2 : {G |- bred (app M1 N1) (app U V)}@
H3 : {D |- path (app M1 N1) P}
H4 : {G |- bred M1 U}*
H5 : {G |- bred N1 V}*
============================
{D |- path (app U V) P}
Subgoal 3 is:
{D |- path N P}
Subgoal 4 is:
{D |- path N P}
bred_ltr < case H3.
Subgoal 2.1:
Variables: G D V N1 U M1 P1
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 G D
H2 : {G |- bred (app M1 N1) (app U V)}@
H4 : {G |- bred M1 U}*
H5 : {G |- bred N1 V}*
H6 : {D |- path M1 P1}
============================
{D |- path (app U V) (left P1)}
Subgoal 2.2 is:
{D |- path (app U V) (right P1)}
Subgoal 2.3 is:
{D |- path (app U V) P}
Subgoal 3 is:
{D |- path N P}
Subgoal 4 is:
{D |- path N P}
bred_ltr < apply IH to _ H4 H6.
Subgoal 2.1:
Variables: G D V N1 U M1 P1
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 G D
H2 : {G |- bred (app M1 N1) (app U V)}@
H4 : {G |- bred M1 U}*
H5 : {G |- bred N1 V}*
H6 : {D |- path M1 P1}
H7 : {D |- path U P1}
============================
{D |- path (app U V) (left P1)}
Subgoal 2.2 is:
{D |- path (app U V) (right P1)}
Subgoal 2.3 is:
{D |- path (app U V) P}
Subgoal 3 is:
{D |- path N P}
Subgoal 4 is:
{D |- path N P}
bred_ltr < search.
Subgoal 2.2:
Variables: G D V N1 U M1 P1
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 G D
H2 : {G |- bred (app M1 N1) (app U V)}@
H4 : {G |- bred M1 U}*
H5 : {G |- bred N1 V}*
H6 : {D |- path N1 P1}
============================
{D |- path (app U V) (right P1)}
Subgoal 2.3 is:
{D |- path (app U V) P}
Subgoal 3 is:
{D |- path N P}
Subgoal 4 is:
{D |- path N P}
bred_ltr < apply IH to _ H5 H6.
Subgoal 2.2:
Variables: G D V N1 U M1 P1
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 G D
H2 : {G |- bred (app M1 N1) (app U V)}@
H4 : {G |- bred M1 U}*
H5 : {G |- bred N1 V}*
H6 : {D |- path N1 P1}
H7 : {D |- path V P1}
============================
{D |- path (app U V) (right P1)}
Subgoal 2.3 is:
{D |- path (app U V) P}
Subgoal 3 is:
{D |- path N P}
Subgoal 4 is:
{D |- path N P}
bred_ltr < search.
Subgoal 2.3:
Variables: G D P V N1 U M1 F
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 G D
H2 : {G |- bred (app M1 N1) (app U V)}@
H4 : {G |- bred M1 U}*
H5 : {G |- bred N1 V}*
H6 : {D, [F] |- path (app M1 N1) P}
H7 : member F D
============================
{D |- path (app U V) P}
Subgoal 3 is:
{D |- path N P}
Subgoal 4 is:
{D |- path N P}
bred_ltr < apply ctx2_mem_D to H1 H7.
Subgoal 2.3:
Variables: G D P V N1 U M1 F
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 G D
H2 : {G |- bred (app M1 N1) (app U V)}@
H4 : {G |- bred M1 U}*
H5 : {G |- bred N1 V}*
H6 : {D, [F] |- path (app M1 N1) P}
H7 : member F D
H8 : (exists x p, F = path x p /\ name x /\ pname p) \/
(exists x N, F = pi q\path N q => path x q /\ fresh x N)
============================
{D |- path (app U V) P}
Subgoal 3 is:
{D |- path N P}
Subgoal 4 is:
{D |- path N P}
bred_ltr < case H8.
Subgoal 2.3.1:
Variables: G D P V N1 U M1 x p
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 G D
H2 : {G |- bred (app M1 N1) (app U V)}@
H4 : {G |- bred M1 U}*
H5 : {G |- bred N1 V}*
H6 : {D, [path x p] |- path (app M1 N1) P}
H7 : member (path x p) D
H9 : name x
H10 : pname p
============================
{D |- path (app U V) P}
Subgoal 2.3.2 is:
{D |- path (app U V) P}
Subgoal 3 is:
{D |- path N P}
Subgoal 4 is:
{D |- path N P}
bred_ltr < case H9.
Subgoal 2.3.1:
Variables: G D P V N1 U M1 p
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 (G n1) (D n1)
H2 : {G n1 |- bred (app (M1 n1) (N1 n1)) (app (U n1) (V n1))}@
H4 : {G n1 |- bred (M1 n1) (U n1)}*
H5 : {G n1 |- bred (N1 n1) (V n1)}*
H6 : {D n1, [path n1 p] |- path (app (M1 n1) (N1 n1)) P}
H7 : member (path n1 p) (D n1)
H10 : pname p
============================
{D n1 |- path (app (U n1) (V n1)) P}
Subgoal 2.3.2 is:
{D |- path (app U V) P}
Subgoal 3 is:
{D |- path N P}
Subgoal 4 is:
{D |- path N P}
bred_ltr < case H6.
Subgoal 2.3.2:
Variables: G D P V N1 U M1 x N2
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 G D
H2 : {G |- bred (app M1 N1) (app U V)}@
H4 : {G |- bred M1 U}*
H5 : {G |- bred N1 V}*
H6 : {D, [pi q\path N2 q => path x q] |- path (app M1 N1) P}
H7 : member (pi q\path N2 q => path x q) D
H9 : fresh x N2
============================
{D |- path (app U V) P}
Subgoal 3 is:
{D |- path N P}
Subgoal 4 is:
{D |- path N P}
bred_ltr < case H9.
Subgoal 2.3.2:
Variables: G D P V N1 U M1 X
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 (G n1) (D n1)
H2 : {G n1 |- bred (app (M1 n1) (N1 n1)) (app (U n1) (V n1))}@
H4 : {G n1 |- bred (M1 n1) (U n1)}*
H5 : {G n1 |- bred (N1 n1) (V n1)}*
H6 : {D n1, [pi q\path X q => path n1 q] |- path (app (M1 n1) (N1 n1)) P}
H7 : member (pi q\path X q => path n1 q) (D n1)
============================
{D n1 |- path (app (U n1) (V n1)) P}
Subgoal 3 is:
{D |- path N P}
Subgoal 4 is:
{D |- path N P}
bred_ltr < case H6.
Subgoal 3:
Variables: G D N P R N1
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 G D
H2 : {G |- bred (beta R N1) N}@
H3 : {D |- path (beta R N1) P}
H4 : {G, pi u\bred N1 u => bred n1 u |- bred (R n1) N}*
============================
{D |- path N P}
Subgoal 4 is:
{D |- path N P}
bred_ltr < case H3.
Subgoal 3.1:
Variables: G D N P R N1
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 G D
H2 : {G |- bred (beta R N1) N}@
H4 : {G, pi u\bred N1 u => bred n1 u |- bred (R n1) N}*
H5 : {D, pi q\path N1 q => path n1 q |- path (R n1) P}
============================
{D |- path N P}
Subgoal 3.2 is:
{D |- path N P}
Subgoal 4 is:
{D |- path N P}
bred_ltr < apply IH to _ H4 H5.
Subgoal 3.1:
Variables: G D N P R N1
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 G D
H2 : {G |- bred (beta R N1) N}@
H4 : {G, pi u\bred N1 u => bred n1 u |- bred (R n1) N}*
H5 : {D, pi q\path N1 q => path n1 q |- path (R n1) P}
H6 : {D, pi q\path N1 q => path n1 q |- path N P}
============================
{D |- path N P}
Subgoal 3.2 is:
{D |- path N P}
Subgoal 4 is:
{D |- path N P}
bred_ltr < inst H6 with n1 = N1.
Subgoal 3.1:
Variables: G D N P R N1
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 G D
H2 : {G |- bred (beta R N1) N}@
H4 : {G, pi u\bred N1 u => bred n1 u |- bred (R n1) N}*
H5 : {D, pi q\path N1 q => path n1 q |- path (R n1) P}
H6 : {D, pi q\path N1 q => path n1 q |- path N P}
H7 : {D, pi q\path N1 q => path N1 q |- path N P}
============================
{D |- path N P}
Subgoal 3.2 is:
{D |- path N P}
Subgoal 4 is:
{D |- path N P}
bred_ltr < assert {D |- pi q\path N1 q => path N1 q}.
Subgoal 3.1:
Variables: G D N P R N1
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 G D
H2 : {G |- bred (beta R N1) N}@
H4 : {G, pi u\bred N1 u => bred n1 u |- bred (R n1) N}*
H5 : {D, pi q\path N1 q => path n1 q |- path (R n1) P}
H6 : {D, pi q\path N1 q => path n1 q |- path N P}
H7 : {D, pi q\path N1 q => path N1 q |- path N P}
H8 : {D |- pi q\path N1 q => path N1 q}
============================
{D |- path N P}
Subgoal 3.2 is:
{D |- path N P}
Subgoal 4 is:
{D |- path N P}
bred_ltr < cut H7 with H8.
Subgoal 3.1:
Variables: G D N P R N1
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 G D
H2 : {G |- bred (beta R N1) N}@
H4 : {G, pi u\bred N1 u => bred n1 u |- bred (R n1) N}*
H5 : {D, pi q\path N1 q => path n1 q |- path (R n1) P}
H6 : {D, pi q\path N1 q => path n1 q |- path N P}
H7 : {D, pi q\path N1 q => path N1 q |- path N P}
H8 : {D |- pi q\path N1 q => path N1 q}
H9 : {D |- path N P}
============================
{D |- path N P}
Subgoal 3.2 is:
{D |- path N P}
Subgoal 4 is:
{D |- path N P}
bred_ltr < search.
Subgoal 3.2:
Variables: G D N P R N1 F
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 G D
H2 : {G |- bred (beta R N1) N}@
H4 : {G, pi u\bred N1 u => bred n1 u |- bred (R n1) N}*
H5 : {D, [F] |- path (beta R N1) P}
H6 : member F D
============================
{D |- path N P}
Subgoal 4 is:
{D |- path N P}
bred_ltr < apply ctx2_mem_D to H1 H6.
Subgoal 3.2:
Variables: G D N P R N1 F
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 G D
H2 : {G |- bred (beta R N1) N}@
H4 : {G, pi u\bred N1 u => bred n1 u |- bred (R n1) N}*
H5 : {D, [F] |- path (beta R N1) P}
H6 : member F D
H7 : (exists x p, F = path x p /\ name x /\ pname p) \/
(exists x N, F = pi q\path N q => path x q /\ fresh x N)
============================
{D |- path N P}
Subgoal 4 is:
{D |- path N P}
bred_ltr < case H7.
Subgoal 3.2.1:
Variables: G D N P R N1 x p
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 G D
H2 : {G |- bred (beta R N1) N}@
H4 : {G, pi u\bred N1 u => bred n1 u |- bred (R n1) N}*
H5 : {D, [path x p] |- path (beta R N1) P}
H6 : member (path x p) D
H8 : name x
H9 : pname p
============================
{D |- path N P}
Subgoal 3.2.2 is:
{D |- path N P}
Subgoal 4 is:
{D |- path N P}
bred_ltr < case H8.
Subgoal 3.2.1:
Variables: G D N P R N1 p
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 (G n2) (D n2)
H2 : {G n2 |- bred (beta (R n2) (N1 n2)) (N n2)}@
H4 : {G n2, pi u\bred (N1 n2) u => bred n1 u |- bred (R n2 n1) (N n2)}*
H5 : {D n2, [path n2 p] |- path (beta (R n2) (N1 n2)) P}
H6 : member (path n2 p) (D n2)
H9 : pname p
============================
{D n2 |- path (N n2) P}
Subgoal 3.2.2 is:
{D |- path N P}
Subgoal 4 is:
{D |- path N P}
bred_ltr < case H5.
Subgoal 3.2.2:
Variables: G D N P R N1 x N2
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 G D
H2 : {G |- bred (beta R N1) N}@
H4 : {G, pi u\bred N1 u => bred n1 u |- bred (R n1) N}*
H5 : {D, [pi q\path N2 q => path x q] |- path (beta R N1) P}
H6 : member (pi q\path N2 q => path x q) D
H8 : fresh x N2
============================
{D |- path N P}
Subgoal 4 is:
{D |- path N P}
bred_ltr < case H8.
Subgoal 3.2.2:
Variables: G D N P R N1 X
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 (G n2) (D n2)
H2 : {G n2 |- bred (beta (R n2) (N1 n2)) (N n2)}@
H4 : {G n2, pi u\bred (N1 n2) u => bred n1 u |- bred (R n2 n1) (N n2)}*
H5 : {D n2, [pi q\path X q => path n2 q] |- path (beta (R n2) (N1 n2)) P}
H6 : member (pi q\path X q => path n2 q) (D n2)
============================
{D n2 |- path (N n2) P}
Subgoal 4 is:
{D |- path N P}
bred_ltr < case H5.
Subgoal 4:
Variables: G D M N P F
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 G D
H2 : {G |- bred M N}@
H3 : {D |- path M P}
H4 : {G, [F] |- bred M N}*
H5 : member F G
============================
{D |- path N P}
bred_ltr < apply ctx2_mem_G to H1 H5.
Subgoal 4:
Variables: G D M N P F
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 G D
H2 : {G |- bred M N}@
H3 : {D |- path M P}
H4 : {G, [F] |- bred M N}*
H5 : member F G
H6 : (exists x, F = bred x x /\ name x) \/
(exists x N, F = pi u\bred N u => bred x u /\ fresh x N)
============================
{D |- path N P}
bred_ltr < case H6.
Subgoal 4.1:
Variables: G D M N P x
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 G D
H2 : {G |- bred M N}@
H3 : {D |- path M P}
H4 : {G, [bred x x] |- bred M N}*
H5 : member (bred x x) G
H7 : name x
============================
{D |- path N P}
Subgoal 4.2 is:
{D |- path N P}
bred_ltr < case H7.
Subgoal 4.1:
Variables: G D M N P
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 (G n1) (D n1)
H2 : {G n1 |- bred (M n1) (N n1)}@
H3 : {D n1 |- path (M n1) P}
H4 : {G n1, [bred n1 n1] |- bred (M n1) (N n1)}*
H5 : member (bred n1 n1) (G n1)
============================
{D n1 |- path (N n1) P}
Subgoal 4.2 is:
{D |- path N P}
bred_ltr < case H4.
Subgoal 4.1:
Variables: G D P
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 (G n1) (D n1)
H2 : {G n1 |- bred n1 n1}@
H3 : {D n1 |- path n1 P}
H5 : member (bred n1 n1) (G n1)
============================
{D n1 |- path n1 P}
Subgoal 4.2 is:
{D |- path N P}
bred_ltr < search.
Subgoal 4.2:
Variables: G D M N P x N1
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 G D
H2 : {G |- bred M N}@
H3 : {D |- path M P}
H4 : {G, [pi u\bred N1 u => bred x u] |- bred M N}*
H5 : member (pi u\bred N1 u => bred x u) G
H7 : fresh x N1
============================
{D |- path N P}
bred_ltr < case H7.
Subgoal 4.2:
Variables: G D M N P X
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 (G n1) (D n1)
H2 : {G n1 |- bred (M n1) (N n1)}@
H3 : {D n1 |- path (M n1) P}
H4 : {G n1, [pi u\bred X u => bred n1 u] |- bred (M n1) (N n1)}*
H5 : member (pi u\bred X u => bred n1 u) (G n1)
============================
{D n1 |- path (N n1) P}
bred_ltr < case H4.
Subgoal 4.2:
Variables: G D N P X
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 (G n1) (D n1)
H2 : {G n1 |- bred n1 (N n1)}@
H3 : {D n1 |- path n1 P}
H5 : member (pi u\bred X u => bred n1 u) (G n1)
H8 : {G n1 |- bred X (N n1)}*
============================
{D n1 |- path (N n1) P}
bred_ltr < assert {D n1 |- path X P}.
Subgoal 4.2.1:
Variables: G D N P X
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 (G n1) (D n1)
H2 : {G n1 |- bred n1 (N n1)}@
H3 : {D n1 |- path n1 P}
H5 : member (pi u\bred X u => bred n1 u) (G n1)
H8 : {G n1 |- bred X (N n1)}*
============================
{D n1 |- path X P}
Subgoal 4.2 is:
{D n1 |- path (N n1) P}
bred_ltr < apply ctx2_uniform to H1 H5.
Subgoal 4.2.1:
Variables: G D N P X
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 (G n1) (D n1)
H2 : {G n1 |- bred n1 (N n1)}@
H3 : {D n1 |- path n1 P}
H5 : member (pi u\bred X u => bred n1 u) (G n1)
H8 : {G n1 |- bred X (N n1)}*
H9 : member (pi q\path X q => path n1 q) (D n1)
============================
{D n1 |- path X P}
Subgoal 4.2 is:
{D n1 |- path (N n1) P}
bred_ltr < apply jump_D_invert to H1 H9 H3.
Subgoal 4.2.1:
Variables: G D N P X
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 (G n1) (D n1)
H2 : {G n1 |- bred n1 (N n1)}@
H3 : {D n1 |- path n1 P}
H5 : member (pi u\bred X u => bred n1 u) (G n1)
H8 : {G n1 |- bred X (N n1)}*
H9 : member (pi q\path X q => path n1 q) (D n1)
H10 : {D n1 |- path X P}
============================
{D n1 |- path X P}
Subgoal 4.2 is:
{D n1 |- path (N n1) P}
bred_ltr < search.
Subgoal 4.2:
Variables: G D N P X
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 (G n1) (D n1)
H2 : {G n1 |- bred n1 (N n1)}@
H3 : {D n1 |- path n1 P}
H5 : member (pi u\bred X u => bred n1 u) (G n1)
H8 : {G n1 |- bred X (N n1)}*
H9 : {D n1 |- path X P}
============================
{D n1 |- path (N n1) P}
bred_ltr < apply IH to H1 H8 H9.
Subgoal 4.2:
Variables: G D N P X
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path M P} ->
{D |- path N P}
H1 : ctx2 (G n1) (D n1)
H2 : {G n1 |- bred n1 (N n1)}@
H3 : {D n1 |- path n1 P}
H5 : member (pi u\bred X u => bred n1 u) (G n1)
H8 : {G n1 |- bred X (N n1)}*
H9 : {D n1 |- path X P}
H10 : {D n1 |- path (N n1) P}
============================
{D n1 |- path (N n1) P}
bred_ltr < search.
Proof completed.
Abella < Theorem bred_rtl :
forall G D M N P, ctx2 G D -> {G |- bred M N} -> {D |- path N P} ->
{D |- path M P}.
============================
forall G D M N P, ctx2 G D -> {G |- bred M N} -> {D |- path N P} ->
{D |- path M P}
bred_rtl < induction on 2.
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path N P} ->
{D |- path M P}
============================
forall G D M N P, ctx2 G D -> {G |- bred M N}@ -> {D |- path N P} ->
{D |- path M P}
bred_rtl < intros.
Variables: G D M N P
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path N P} ->
{D |- path M P}
H1 : ctx2 G D
H2 : {G |- bred M N}@
H3 : {D |- path N P}
============================
{D |- path M P}
bred_rtl < case H2 (keep).
Subgoal 1:
Variables: G D P U M1
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path N P} ->
{D |- path M P}
H1 : ctx2 G D
H2 : {G |- bred (abs M1) (abs U)}@
H3 : {D |- path (abs U) P}
H4 : {G, bred n1 n1 |- bred (M1 n1) (U n1)}*
============================
{D |- path (abs M1) P}
Subgoal 2 is:
{D |- path (app M1 N1) P}
Subgoal 3 is:
{D |- path (beta R N1) P}
Subgoal 4 is:
{D |- path M P}
bred_rtl < case H3.
Subgoal 1.1:
Variables: G D U M1 P1
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path N P} ->
{D |- path M P}
H1 : ctx2 G D
H2 : {G |- bred (abs M1) (abs U)}@
H4 : {G, bred n1 n1 |- bred (M1 n1) (U n1)}*
H5 : {D, path n1 n2 |- path (U n1) (P1 n2)}
============================
{D |- path (abs M1) (bnd P1)}
Subgoal 1.2 is:
{D |- path (abs M1) P}
Subgoal 2 is:
{D |- path (app M1 N1) P}
Subgoal 3 is:
{D |- path (beta R N1) P}
Subgoal 4 is:
{D |- path M P}
bred_rtl < apply IH to _ H4 H5.
Subgoal 1.1:
Variables: G D U M1 P1
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path N P} ->
{D |- path M P}
H1 : ctx2 G D
H2 : {G |- bred (abs M1) (abs U)}@
H4 : {G, bred n1 n1 |- bred (M1 n1) (U n1)}*
H5 : {D, path n1 n2 |- path (U n1) (P1 n2)}
H6 : {D, path n1 n2 |- path (M1 n1) (P1 n2)}
============================
{D |- path (abs M1) (bnd P1)}
Subgoal 1.2 is:
{D |- path (abs M1) P}
Subgoal 2 is:
{D |- path (app M1 N1) P}
Subgoal 3 is:
{D |- path (beta R N1) P}
Subgoal 4 is:
{D |- path M P}
bred_rtl < search.
Subgoal 1.2:
Variables: G D P U M1 F
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path N P} ->
{D |- path M P}
H1 : ctx2 G D
H2 : {G |- bred (abs M1) (abs U)}@
H4 : {G, bred n1 n1 |- bred (M1 n1) (U n1)}*
H5 : {D, [F] |- path (abs U) P}
H6 : member F D
============================
{D |- path (abs M1) P}
Subgoal 2 is:
{D |- path (app M1 N1) P}
Subgoal 3 is:
{D |- path (beta R N1) P}
Subgoal 4 is:
{D |- path M P}
bred_rtl < apply ctx2_mem_D to H1 H6.
Subgoal 1.2:
Variables: G D P U M1 F
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path N P} ->
{D |- path M P}
H1 : ctx2 G D
H2 : {G |- bred (abs M1) (abs U)}@
H4 : {G, bred n1 n1 |- bred (M1 n1) (U n1)}*
H5 : {D, [F] |- path (abs U) P}
H6 : member F D
H7 : (exists x p, F = path x p /\ name x /\ pname p) \/
(exists x N, F = pi q\path N q => path x q /\ fresh x N)
============================
{D |- path (abs M1) P}
Subgoal 2 is:
{D |- path (app M1 N1) P}
Subgoal 3 is:
{D |- path (beta R N1) P}
Subgoal 4 is:
{D |- path M P}
bred_rtl < case H7.
Subgoal 1.2.1:
Variables: G D P U M1 x p
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path N P} ->
{D |- path M P}
H1 : ctx2 G D
H2 : {G |- bred (abs M1) (abs U)}@
H4 : {G, bred n1 n1 |- bred (M1 n1) (U n1)}*
H5 : {D, [path x p] |- path (abs U) P}
H6 : member (path x p) D
H8 : name x
H9 : pname p
============================
{D |- path (abs M1) P}
Subgoal 1.2.2 is:
{D |- path (abs M1) P}
Subgoal 2 is:
{D |- path (app M1 N1) P}
Subgoal 3 is:
{D |- path (beta R N1) P}
Subgoal 4 is:
{D |- path M P}
bred_rtl < case H8.
Subgoal 1.2.1:
Variables: G D P U M1 p
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path N P} ->
{D |- path M P}
H1 : ctx2 (G n2) (D n2)
H2 : {G n2 |- bred (abs (M1 n2)) (abs (U n2))}@
H4 : {G n2, bred n1 n1 |- bred (M1 n2 n1) (U n2 n1)}*
H5 : {D n2, [path n2 p] |- path (abs (U n2)) P}
H6 : member (path n2 p) (D n2)
H9 : pname p
============================
{D n2 |- path (abs (M1 n2)) P}
Subgoal 1.2.2 is:
{D |- path (abs M1) P}
Subgoal 2 is:
{D |- path (app M1 N1) P}
Subgoal 3 is:
{D |- path (beta R N1) P}
Subgoal 4 is:
{D |- path M P}
bred_rtl < case H5.
Subgoal 1.2.2:
Variables: G D P U M1 x N1
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path N P} ->
{D |- path M P}
H1 : ctx2 G D
H2 : {G |- bred (abs M1) (abs U)}@
H4 : {G, bred n1 n1 |- bred (M1 n1) (U n1)}*
H5 : {D, [pi q\path N1 q => path x q] |- path (abs U) P}
H6 : member (pi q\path N1 q => path x q) D
H8 : fresh x N1
============================
{D |- path (abs M1) P}
Subgoal 2 is:
{D |- path (app M1 N1) P}
Subgoal 3 is:
{D |- path (beta R N1) P}
Subgoal 4 is:
{D |- path M P}
bred_rtl < case H8.
Subgoal 1.2.2:
Variables: G D P U M1 X
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path N P} ->
{D |- path M P}
H1 : ctx2 (G n2) (D n2)
H2 : {G n2 |- bred (abs (M1 n2)) (abs (U n2))}@
H4 : {G n2, bred n1 n1 |- bred (M1 n2 n1) (U n2 n1)}*
H5 : {D n2, [pi q\path X q => path n2 q] |- path (abs (U n2)) P}
H6 : member (pi q\path X q => path n2 q) (D n2)
============================
{D n2 |- path (abs (M1 n2)) P}
Subgoal 2 is:
{D |- path (app M1 N1) P}
Subgoal 3 is:
{D |- path (beta R N1) P}
Subgoal 4 is:
{D |- path M P}
bred_rtl < case H5.
Subgoal 2:
Variables: G D P V N1 U M1
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path N P} ->
{D |- path M P}
H1 : ctx2 G D
H2 : {G |- bred (app M1 N1) (app U V)}@
H3 : {D |- path (app U V) P}
H4 : {G |- bred M1 U}*
H5 : {G |- bred N1 V}*
============================
{D |- path (app M1 N1) P}
Subgoal 3 is:
{D |- path (beta R N1) P}
Subgoal 4 is:
{D |- path M P}
bred_rtl < case H3.
Subgoal 2.1:
Variables: G D V N1 U M1 P1
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path N P} ->
{D |- path M P}
H1 : ctx2 G D
H2 : {G |- bred (app M1 N1) (app U V)}@
H4 : {G |- bred M1 U}*
H5 : {G |- bred N1 V}*
H6 : {D |- path U P1}
============================
{D |- path (app M1 N1) (left P1)}
Subgoal 2.2 is:
{D |- path (app M1 N1) (right P1)}
Subgoal 2.3 is:
{D |- path (app M1 N1) P}
Subgoal 3 is:
{D |- path (beta R N1) P}
Subgoal 4 is:
{D |- path M P}
bred_rtl < apply IH to _ H4 H6.
Subgoal 2.1:
Variables: G D V N1 U M1 P1
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path N P} ->
{D |- path M P}
H1 : ctx2 G D
H2 : {G |- bred (app M1 N1) (app U V)}@
H4 : {G |- bred M1 U}*
H5 : {G |- bred N1 V}*
H6 : {D |- path U P1}
H7 : {D |- path M1 P1}
============================
{D |- path (app M1 N1) (left P1)}
Subgoal 2.2 is:
{D |- path (app M1 N1) (right P1)}
Subgoal 2.3 is:
{D |- path (app M1 N1) P}
Subgoal 3 is:
{D |- path (beta R N1) P}
Subgoal 4 is:
{D |- path M P}
bred_rtl < search.
Subgoal 2.2:
Variables: G D V N1 U M1 P1
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path N P} ->
{D |- path M P}
H1 : ctx2 G D
H2 : {G |- bred (app M1 N1) (app U V)}@
H4 : {G |- bred M1 U}*
H5 : {G |- bred N1 V}*
H6 : {D |- path V P1}
============================
{D |- path (app M1 N1) (right P1)}
Subgoal 2.3 is:
{D |- path (app M1 N1) P}
Subgoal 3 is:
{D |- path (beta R N1) P}
Subgoal 4 is:
{D |- path M P}
bred_rtl < apply IH to _ H5 H6.
Subgoal 2.2:
Variables: G D V N1 U M1 P1
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path N P} ->
{D |- path M P}
H1 : ctx2 G D
H2 : {G |- bred (app M1 N1) (app U V)}@
H4 : {G |- bred M1 U}*
H5 : {G |- bred N1 V}*
H6 : {D |- path V P1}
H7 : {D |- path N1 P1}
============================
{D |- path (app M1 N1) (right P1)}
Subgoal 2.3 is:
{D |- path (app M1 N1) P}
Subgoal 3 is:
{D |- path (beta R N1) P}
Subgoal 4 is:
{D |- path M P}
bred_rtl < search.
Subgoal 2.3:
Variables: G D P V N1 U M1 F
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path N P} ->
{D |- path M P}
H1 : ctx2 G D
H2 : {G |- bred (app M1 N1) (app U V)}@
H4 : {G |- bred M1 U}*
H5 : {G |- bred N1 V}*
H6 : {D, [F] |- path (app U V) P}
H7 : member F D
============================
{D |- path (app M1 N1) P}
Subgoal 3 is:
{D |- path (beta R N1) P}
Subgoal 4 is:
{D |- path M P}
bred_rtl < apply ctx2_mem_D to H1 H7.
Subgoal 2.3:
Variables: G D P V N1 U M1 F
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path N P} ->
{D |- path M P}
H1 : ctx2 G D
H2 : {G |- bred (app M1 N1) (app U V)}@
H4 : {G |- bred M1 U}*
H5 : {G |- bred N1 V}*
H6 : {D, [F] |- path (app U V) P}
H7 : member F D
H8 : (exists x p, F = path x p /\ name x /\ pname p) \/
(exists x N, F = pi q\path N q => path x q /\ fresh x N)
============================
{D |- path (app M1 N1) P}
Subgoal 3 is:
{D |- path (beta R N1) P}
Subgoal 4 is:
{D |- path M P}
bred_rtl < case H8.
Subgoal 2.3.1:
Variables: G D P V N1 U M1 x p
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path N P} ->
{D |- path M P}
H1 : ctx2 G D
H2 : {G |- bred (app M1 N1) (app U V)}@
H4 : {G |- bred M1 U}*
H5 : {G |- bred N1 V}*
H6 : {D, [path x p] |- path (app U V) P}
H7 : member (path x p) D
H9 : name x
H10 : pname p
============================
{D |- path (app M1 N1) P}
Subgoal 2.3.2 is:
{D |- path (app M1 N1) P}
Subgoal 3 is:
{D |- path (beta R N1) P}
Subgoal 4 is:
{D |- path M P}
bred_rtl < case H9.
Subgoal 2.3.1:
Variables: G D P V N1 U M1 p
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path N P} ->
{D |- path M P}
H1 : ctx2 (G n1) (D n1)
H2 : {G n1 |- bred (app (M1 n1) (N1 n1)) (app (U n1) (V n1))}@
H4 : {G n1 |- bred (M1 n1) (U n1)}*
H5 : {G n1 |- bred (N1 n1) (V n1)}*
H6 : {D n1, [path n1 p] |- path (app (U n1) (V n1)) P}
H7 : member (path n1 p) (D n1)
H10 : pname p
============================
{D n1 |- path (app (M1 n1) (N1 n1)) P}
Subgoal 2.3.2 is:
{D |- path (app M1 N1) P}
Subgoal 3 is:
{D |- path (beta R N1) P}
Subgoal 4 is:
{D |- path M P}
bred_rtl < case H6.
Subgoal 2.3.2:
Variables: G D P V N1 U M1 x N2
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path N P} ->
{D |- path M P}
H1 : ctx2 G D
H2 : {G |- bred (app M1 N1) (app U V)}@
H4 : {G |- bred M1 U}*
H5 : {G |- bred N1 V}*
H6 : {D, [pi q\path N2 q => path x q] |- path (app U V) P}
H7 : member (pi q\path N2 q => path x q) D
H9 : fresh x N2
============================
{D |- path (app M1 N1) P}
Subgoal 3 is:
{D |- path (beta R N1) P}
Subgoal 4 is:
{D |- path M P}
bred_rtl < case H9.
Subgoal 2.3.2:
Variables: G D P V N1 U M1 X
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path N P} ->
{D |- path M P}
H1 : ctx2 (G n1) (D n1)
H2 : {G n1 |- bred (app (M1 n1) (N1 n1)) (app (U n1) (V n1))}@
H4 : {G n1 |- bred (M1 n1) (U n1)}*
H5 : {G n1 |- bred (N1 n1) (V n1)}*
H6 : {D n1, [pi q\path X q => path n1 q] |- path (app (U n1) (V n1)) P}
H7 : member (pi q\path X q => path n1 q) (D n1)
============================
{D n1 |- path (app (M1 n1) (N1 n1)) P}
Subgoal 3 is:
{D |- path (beta R N1) P}
Subgoal 4 is:
{D |- path M P}
bred_rtl < case H6.
Subgoal 3:
Variables: G D N P R N1
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path N P} ->
{D |- path M P}
H1 : ctx2 G D
H2 : {G |- bred (beta R N1) N}@
H3 : {D |- path N P}
H4 : {G, pi u\bred N1 u => bred n1 u |- bred (R n1) N}*
============================
{D |- path (beta R N1) P}
Subgoal 4 is:
{D |- path M P}
bred_rtl < assert {D, pi q\path N1 q => path n1 q |- path N P}.
Subgoal 3:
Variables: G D N P R N1
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path N P} ->
{D |- path M P}
H1 : ctx2 G D
H2 : {G |- bred (beta R N1) N}@
H3 : {D |- path N P}
H4 : {G, pi u\bred N1 u => bred n1 u |- bred (R n1) N}*
H5 : {D, pi q\path N1 q => path n1 q |- path N P}
============================
{D |- path (beta R N1) P}
Subgoal 4 is:
{D |- path M P}
bred_rtl < apply IH to _ H4 H5.
Subgoal 3:
Variables: G D N P R N1
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path N P} ->
{D |- path M P}
H1 : ctx2 G D
H2 : {G |- bred (beta R N1) N}@
H3 : {D |- path N P}
H4 : {G, pi u\bred N1 u => bred n1 u |- bred (R n1) N}*
H5 : {D, pi q\path N1 q => path n1 q |- path N P}
H6 : {D, pi q\path N1 q => path n1 q |- path (R n1) P}
============================
{D |- path (beta R N1) P}
Subgoal 4 is:
{D |- path M P}
bred_rtl < search.
Subgoal 4:
Variables: G D M N P F
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path N P} ->
{D |- path M P}
H1 : ctx2 G D
H2 : {G |- bred M N}@
H3 : {D |- path N P}
H4 : {G, [F] |- bred M N}*
H5 : member F G
============================
{D |- path M P}
bred_rtl < apply ctx2_mem_G to H1 H5.
Subgoal 4:
Variables: G D M N P F
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path N P} ->
{D |- path M P}
H1 : ctx2 G D
H2 : {G |- bred M N}@
H3 : {D |- path N P}
H4 : {G, [F] |- bred M N}*
H5 : member F G
H6 : (exists x, F = bred x x /\ name x) \/
(exists x N, F = pi u\bred N u => bred x u /\ fresh x N)
============================
{D |- path M P}
bred_rtl < case H6.
Subgoal 4.1:
Variables: G D M N P x
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path N P} ->
{D |- path M P}
H1 : ctx2 G D
H2 : {G |- bred M N}@
H3 : {D |- path N P}
H4 : {G, [bred x x] |- bred M N}*
H5 : member (bred x x) G
H7 : name x
============================
{D |- path M P}
Subgoal 4.2 is:
{D |- path M P}
bred_rtl < case H7.
Subgoal 4.1:
Variables: G D M N P
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path N P} ->
{D |- path M P}
H1 : ctx2 (G n1) (D n1)
H2 : {G n1 |- bred (M n1) (N n1)}@
H3 : {D n1 |- path (N n1) P}
H4 : {G n1, [bred n1 n1] |- bred (M n1) (N n1)}*
H5 : member (bred n1 n1) (G n1)
============================
{D n1 |- path (M n1) P}
Subgoal 4.2 is:
{D |- path M P}
bred_rtl < case H4.
Subgoal 4.1:
Variables: G D P
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path N P} ->
{D |- path M P}
H1 : ctx2 (G n1) (D n1)
H2 : {G n1 |- bred n1 n1}@
H3 : {D n1 |- path n1 P}
H5 : member (bred n1 n1) (G n1)
============================
{D n1 |- path n1 P}
Subgoal 4.2 is:
{D |- path M P}
bred_rtl < search.
Subgoal 4.2:
Variables: G D M N P x N1
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path N P} ->
{D |- path M P}
H1 : ctx2 G D
H2 : {G |- bred M N}@
H3 : {D |- path N P}
H4 : {G, [pi u\bred N1 u => bred x u] |- bred M N}*
H5 : member (pi u\bred N1 u => bred x u) G
H7 : fresh x N1
============================
{D |- path M P}
bred_rtl < case H7.
Subgoal 4.2:
Variables: G D M N P X
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path N P} ->
{D |- path M P}
H1 : ctx2 (G n1) (D n1)
H2 : {G n1 |- bred (M n1) (N n1)}@
H3 : {D n1 |- path (N n1) P}
H4 : {G n1, [pi u\bred X u => bred n1 u] |- bred (M n1) (N n1)}*
H5 : member (pi u\bred X u => bred n1 u) (G n1)
============================
{D n1 |- path (M n1) P}
bred_rtl < case H4.
Subgoal 4.2:
Variables: G D N P X
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path N P} ->
{D |- path M P}
H1 : ctx2 (G n1) (D n1)
H2 : {G n1 |- bred n1 (N n1)}@
H3 : {D n1 |- path (N n1) P}
H5 : member (pi u\bred X u => bred n1 u) (G n1)
H8 : {G n1 |- bred X (N n1)}*
============================
{D n1 |- path n1 P}
bred_rtl < apply IH to H1 H8 H3.
Subgoal 4.2:
Variables: G D N P X
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path N P} ->
{D |- path M P}
H1 : ctx2 (G n1) (D n1)
H2 : {G n1 |- bred n1 (N n1)}@
H3 : {D n1 |- path (N n1) P}
H5 : member (pi u\bred X u => bred n1 u) (G n1)
H8 : {G n1 |- bred X (N n1)}*
H9 : {D n1 |- path X P}
============================
{D n1 |- path n1 P}
bred_rtl < apply ctx2_uniform to H1 H5.
Subgoal 4.2:
Variables: G D N P X
IH : forall G D M N P, ctx2 G D -> {G |- bred M N}* -> {D |- path N P} ->
{D |- path M P}
H1 : ctx2 (G n1) (D n1)
H2 : {G n1 |- bred n1 (N n1)}@
H3 : {D n1 |- path (N n1) P}
H5 : member (pi u\bred X u => bred n1 u) (G n1)
H8 : {G n1 |- bred X (N n1)}*
H9 : {D n1 |- path X P}
H10 : member (pi q\path X q => path n1 q) (D n1)
============================
{D n1 |- path n1 P}
bred_rtl < search.
Proof completed.
Abella < Define bfctx : olist -> olist -> prop by
bfctx nil nil;
nabla n p, bfctx (bfree n :: L) (path n p :: K) := bfctx L K.
Abella < Theorem member_prune_path :
forall E L, nabla x, member (E x) L -> (exists F, E = y\F).
============================
forall E L, nabla x, member (E x) L -> (exists F, E = y\F)
member_prune_path < induction on 1.
IH : forall E L, nabla x, member (E x) L * -> (exists F, E = y\F)
============================
forall E L, nabla x, member (E x) L @ -> (exists F, E = y\F)
member_prune_path < intros.
Variables: E L
IH : forall E L, nabla x, member (E x) L * -> (exists F, E = y\F)
H1 : member (E n1) L @
============================
exists F, E = y\F
member_prune_path < case H1.
Subgoal 1:
Variables: L3 L2
IH : forall E L, nabla x, member (E x) L * -> (exists F, E = y\F)
============================
exists F, z1\L2 = y\F
Subgoal 2 is:
exists F, E = y\F
member_prune_path < search.
Subgoal 2:
Variables: E L3 L2
IH : forall E L, nabla x, member (E x) L * -> (exists F, E = y\F)
H2 : member (E n1) L3 *
============================
exists F, E = y\F
member_prune_path < apply IH to H2.
Subgoal 2:
Variables: L3 L2 F
IH : forall E L, nabla x, member (E x) L * -> (exists F, E = y\F)
H2 : member F L3 *
============================
exists F1, z1\F = y\F1
member_prune_path < search.
Proof completed.
Abella < Theorem bfctx_member1 :
forall X L K, bfctx L K -> member X L ->
(exists E F, X = bfree E /\ name E /\ member (path E F) K /\ pname F).
============================
forall X L K, bfctx L K -> member X L ->
(exists E F, X = bfree E /\ name E /\ member (path E F) K /\ pname F)
bfctx_member1 < induction on 1.
IH : forall X L K, bfctx L K * -> member X L ->
(exists E F, X = bfree E /\ name E /\ member (path E F) K /\ pname F)
============================
forall X L K, bfctx L K @ -> member X L ->
(exists E F, X = bfree E /\ name E /\ member (path E F) K /\ pname F)
bfctx_member1 < intros.
Variables: X L K
IH : forall X L K, bfctx L K * -> member X L ->
(exists E F, X = bfree E /\ name E /\ member (path E F) K /\ pname F)
H1 : bfctx L K @
H2 : member X L
============================
exists E F, X = bfree E /\ name E /\ member (path E F) K /\ pname F
bfctx_member1 < case H1.
Subgoal 1:
Variables: X
IH : forall X L K, bfctx L K * -> member X L ->
(exists E F, X = bfree E /\ name E /\ member (path E F) K /\ pname F)
H2 : member X nil
============================
exists E F, X = bfree E /\ name E /\ member (path E F) nil /\ pname F
Subgoal 2 is:
exists E F, X n1 n2 = bfree E /\ name E /\
member (path E F) (path n1 n2 :: K1) /\ pname F
bfctx_member1 < case H2.
Subgoal 2:
Variables: X K1 L1
IH : forall X L K, bfctx L K * -> member X L ->
(exists E F, X = bfree E /\ name E /\ member (path E F) K /\ pname F)
H2 : member (X n1 n2) (bfree n1 :: L1)
H3 : bfctx L1 K1 *
============================
exists E F, X n1 n2 = bfree E /\ name E /\
member (path E F) (path n1 n2 :: K1) /\ pname F
bfctx_member1 < case H2.
Subgoal 2.1:
Variables: K1 L1
IH : forall X L K, bfctx L K * -> member X L ->
(exists E F, X = bfree E /\ name E /\ member (path E F) K /\ pname F)
H3 : bfctx L1 K1 *
============================
exists E F, bfree n1 = bfree E /\ name E /\
member (path E F) (path n1 n2 :: K1) /\ pname F
Subgoal 2.2 is:
exists E F, X n1 n2 = bfree E /\ name E /\
member (path E F) (path n1 n2 :: K1) /\ pname F
bfctx_member1 < search.
Subgoal 2.2:
Variables: X K1 L1
IH : forall X L K, bfctx L K * -> member X L ->
(exists E F, X = bfree E /\ name E /\ member (path E F) K /\ pname F)
H3 : bfctx L1 K1 *
H4 : member (X n1 n2) L1
============================
exists E F, X n1 n2 = bfree E /\ name E /\
member (path E F) (path n1 n2 :: K1) /\ pname F
bfctx_member1 < apply IH to H3 H4.
Subgoal 2.2:
Variables: K1 L1 E F
IH : forall X L K, bfctx L K * -> member X L ->
(exists E F, X = bfree E /\ name E /\ member (path E F) K /\ pname F)
H3 : bfctx L1 K1 *
H4 : member (bfree (E n1)) L1
H5 : name (E n1)
H6 : member (path (E n1) (F n2)) K1
H7 : pname (F n2)
============================
exists E1 F, bfree (E n1) = bfree E1 /\ name E1 /\
member (path E1 F) (path n1 n2 :: K1) /\ pname F
bfctx_member1 < search.
Proof completed.
Abella < Theorem bfctx_member2 :
forall X L K, bfctx L K -> member X K ->
(exists E F, X = path E F /\ name E /\ pname F).
============================
forall X L K, bfctx L K -> member X K ->
(exists E F, X = path E F /\ name E /\ pname F)
bfctx_member2 < induction on 1.
IH : forall X L K, bfctx L K * -> member X K ->
(exists E F, X = path E F /\ name E /\ pname F)
============================
forall X L K, bfctx L K @ -> member X K ->
(exists E F, X = path E F /\ name E /\ pname F)
bfctx_member2 < intros.
Variables: X L K
IH : forall X L K, bfctx L K * -> member X K ->
(exists E F, X = path E F /\ name E /\ pname F)
H1 : bfctx L K @
H2 : member X K
============================
exists E F, X = path E F /\ name E /\ pname F
bfctx_member2 < case H1.
Subgoal 1:
Variables: X
IH : forall X L K, bfctx L K * -> member X K ->
(exists E F, X = path E F /\ name E /\ pname F)
H2 : member X nil
============================
exists E F, X = path E F /\ name E /\ pname F
Subgoal 2 is:
exists E F, X n1 n2 = path E F /\ name E /\ pname F
bfctx_member2 < case H2.
Subgoal 2:
Variables: X K1 L1
IH : forall X L K, bfctx L K * -> member X K ->
(exists E F, X = path E F /\ name E /\ pname F)
H2 : member (X n1 n2) (path n1 n2 :: K1)
H3 : bfctx L1 K1 *
============================
exists E F, X n1 n2 = path E F /\ name E /\ pname F
bfctx_member2 < case H2.
Subgoal 2.1:
Variables: K1 L1
IH : forall X L K, bfctx L K * -> member X K ->
(exists E F, X = path E F /\ name E /\ pname F)
H3 : bfctx L1 K1 *
============================
exists E F, path n1 n2 = path E F /\ name E /\ pname F
Subgoal 2.2 is:
exists E F, X n1 n2 = path E F /\ name E /\ pname F
bfctx_member2 < search.
Subgoal 2.2:
Variables: X K1 L1
IH : forall X L K, bfctx L K * -> member X K ->
(exists E F, X = path E F /\ name E /\ pname F)
H3 : bfctx L1 K1 *
H4 : member (X n1 n2) K1
============================
exists E F, X n1 n2 = path E F /\ name E /\ pname F
bfctx_member2 < apply IH to H3 H4.
Subgoal 2.2:
Variables: K1 L1 E F
IH : forall X L K, bfctx L K * -> member X K ->
(exists E F, X = path E F /\ name E /\ pname F)
H3 : bfctx L1 K1 *
H4 : member (path (E n1) (F n2)) K1
H5 : name (E n1)
H6 : pname (F n2)
============================
exists E1 F1, path (E n1) (F n2) = path E1 F1 /\ name E1 /\ pname F1
bfctx_member2 < search.
Proof completed.
Abella < Theorem member_path_unique :
forall L K X Y F, bfctx L K -> member (path X F) K -> member (path Y F) K ->
X =
Y.
============================
forall L K X Y F, bfctx L K -> member (path X F) K -> member (path Y F) K ->
X =
Y
member_path_unique < induction on 2.
IH : forall L K X Y F, bfctx L K -> member (path X F) K * ->
member (path Y F) K -> X =
Y
============================
forall L K X Y F, bfctx L K -> member (path X F) K @ ->
member (path Y F) K -> X =
Y
member_path_unique < intros.
Variables: L K X Y F
IH : forall L K X Y F, bfctx L K -> member (path X F) K * ->
member (path Y F) K -> X =
Y
H1 : bfctx L K
H2 : member (path X F) K @
H3 : member (path Y F) K
============================
X = Y
member_path_unique < case H2.
Subgoal 1:
Variables: L X Y F L1
IH : forall L K X Y F, bfctx L K -> member (path X F) K * ->
member (path Y F) K -> X =
Y
H1 : bfctx L (path X F :: L1)
H3 : member (path Y F) (path X F :: L1)
============================
X = Y
Subgoal 2 is:
X = Y
member_path_unique < case H3.
Subgoal 1.1:
Variables: L X F L1
IH : forall L K X Y F, bfctx L K -> member (path X F) K * ->
member (path Y F) K -> X =
Y
H1 : bfctx L (path X F :: L1)
============================
X = X
Subgoal 1.2 is:
X = Y
Subgoal 2 is:
X = Y
member_path_unique < search.
Subgoal 1.2:
Variables: L X Y F L1
IH : forall L K X Y F, bfctx L K -> member (path X F) K * ->
member (path Y F) K -> X =
Y
H1 : bfctx L (path X F :: L1)
H4 : member (path Y F) L1
============================
X = Y
Subgoal 2 is:
X = Y
member_path_unique < case H1.
Subgoal 1.2:
Variables: Y K1 L2
IH : forall L K X Y F, bfctx L K -> member (path X F) K * ->
member (path Y F) K -> X =
Y
H4 : member (path (Y n1) n2) K1
H5 : bfctx L2 K1
============================
n1 = Y n1
Subgoal 2 is:
X = Y
member_path_unique < apply member_prune_path to H4.
Subgoal 2:
Variables: L X Y F L1 B
IH : forall L K X Y F, bfctx L K -> member (path X F) K * ->
member (path Y F) K -> X =
Y
H1 : bfctx L (B :: L1)
H3 : member (path Y F) (B :: L1)
H4 : member (path X F) L1 *
============================
X = Y
member_path_unique < case H3.
Subgoal 2.1:
Variables: L X Y F L1
IH : forall L K X Y F, bfctx L K -> member (path X F) K * ->
member (path Y F) K -> X =
Y
H1 : bfctx L (path Y F :: L1)
H4 : member (path X F) L1 *
============================
X = Y
Subgoal 2.2 is:
X = Y
member_path_unique < case H1.
Subgoal 2.1:
Variables: X K1 L2
IH : forall L K X Y F, bfctx L K -> member (path X F) K * ->
member (path Y F) K -> X =
Y
H4 : member (path (X n1) n2) K1 *
H5 : bfctx L2 K1
============================
X n1 = n1
Subgoal 2.2 is:
X = Y
member_path_unique < apply member_prune_path to H4.
Subgoal 2.2:
Variables: L X Y F L1 B
IH : forall L K X Y F, bfctx L K -> member (path X F) K * ->
member (path Y F) K -> X =
Y
H1 : bfctx L (B :: L1)
H4 : member (path X F) L1 *
H5 : member (path Y F) L1
============================
X = Y
member_path_unique < case H1.
Subgoal 2.2:
Variables: X Y F K1 L2
IH : forall L K X Y F, bfctx L K -> member (path X F) K * ->
member (path Y F) K -> X =
Y
H4 : member (path (X n1) (F n2)) K1 *
H5 : member (path (Y n1) (F n2)) K1
H6 : bfctx L2 K1
============================
X n1 = Y n1
member_path_unique < apply IH to H6 H4 H5.
Subgoal 2.2:
Variables: Y F K1 L2
IH : forall L K X Y F, bfctx L K -> member (path X F) K * ->
member (path Y F) K -> X =
Y
H4 : member (path (Y n1) (F n2)) K1 *
H5 : member (path (Y n1) (F n2)) K1
H6 : bfctx L2 K1
============================
Y n1 = Y n1
member_path_unique < search.
Proof completed.
Abella < Theorem path_exists :
forall L K M, bfctx L K -> {L |- bfree M} -> (exists P, {K |- path M P}).
============================
forall L K M, bfctx L K -> {L |- bfree M} -> (exists P, {K |- path M P})
path_exists < induction on 2.
IH : forall L K M, bfctx L K -> {L |- bfree M}* ->
(exists P, {K |- path M P})
============================
forall L K M, bfctx L K -> {L |- bfree M}@ -> (exists P, {K |- path M P})
path_exists < intros.
Variables: L K M
IH : forall L K M, bfctx L K -> {L |- bfree M}* ->
(exists P, {K |- path M P})
H1 : bfctx L K
H2 : {L |- bfree M}@
============================
exists P, {K |- path M P}
path_exists < case H2.
Subgoal 1:
Variables: L K M1
IH : forall L K M, bfctx L K -> {L |- bfree M}* ->
(exists P, {K |- path M P})
H1 : bfctx L K
H3 : {L, bfree n1 |- bfree (M1 n1)}*
============================
exists P, {K |- path (abs M1) P}
Subgoal 2 is:
exists P, {K |- path (app M1 N) P}
Subgoal 3 is:
exists P, {K |- path M P}
path_exists < assert bfctx (bfree n1 :: L) (path n1 n2 :: K).
Subgoal 1:
Variables: L K M1
IH : forall L K M, bfctx L K -> {L |- bfree M}* ->
(exists P, {K |- path M P})
H1 : bfctx L K
H3 : {L, bfree n1 |- bfree (M1 n1)}*
H4 : bfctx (bfree n1 :: L) (path n1 n2 :: K)
============================
exists P, {K |- path (abs M1) P}
Subgoal 2 is:
exists P, {K |- path (app M1 N) P}
Subgoal 3 is:
exists P, {K |- path M P}
path_exists < apply IH to H4 H3.
Subgoal 1:
Variables: L K M1 P
IH : forall L K M, bfctx L K -> {L |- bfree M}* ->
(exists P, {K |- path M P})
H1 : bfctx L K
H3 : {L, bfree n1 |- bfree (M1 n1)}*
H4 : bfctx (bfree n1 :: L) (path n1 n2 :: K)
H5 : {K, path n1 n2 |- path (M1 n1) (P n2)}
============================
exists P, {K |- path (abs M1) P}
Subgoal 2 is:
exists P, {K |- path (app M1 N) P}
Subgoal 3 is:
exists P, {K |- path M P}
path_exists < exists bnd P.
Subgoal 1:
Variables: L K M1 P
IH : forall L K M, bfctx L K -> {L |- bfree M}* ->
(exists P, {K |- path M P})
H1 : bfctx L K
H3 : {L, bfree n1 |- bfree (M1 n1)}*
H4 : bfctx (bfree n1 :: L) (path n1 n2 :: K)
H5 : {K, path n1 n2 |- path (M1 n1) (P n2)}
============================
{K |- path (abs M1) (bnd P)}
Subgoal 2 is:
exists P, {K |- path (app M1 N) P}
Subgoal 3 is:
exists P, {K |- path M P}
path_exists < search.
Subgoal 2:
Variables: L K N M1
IH : forall L K M, bfctx L K -> {L |- bfree M}* ->
(exists P, {K |- path M P})
H1 : bfctx L K
H3 : {L |- bfree M1}*
H4 : {L |- bfree N}*
============================
exists P, {K |- path (app M1 N) P}
Subgoal 3 is:
exists P, {K |- path M P}
path_exists < apply IH to H1 H3.
Subgoal 2:
Variables: L K N M1 P
IH : forall L K M, bfctx L K -> {L |- bfree M}* ->
(exists P, {K |- path M P})
H1 : bfctx L K
H3 : {L |- bfree M1}*
H4 : {L |- bfree N}*
H5 : {K |- path M1 P}
============================
exists P, {K |- path (app M1 N) P}
Subgoal 3 is:
exists P, {K |- path M P}
path_exists < search.
Subgoal 3:
Variables: L K M F
IH : forall L K M, bfctx L K -> {L |- bfree M}* ->
(exists P, {K |- path M P})
H1 : bfctx L K
H3 : {L, [F] |- bfree M}*
H4 : member F L
============================
exists P, {K |- path M P}
path_exists < apply bfctx_member1 to H1 H4.
Subgoal 3:
Variables: L K M E F1
IH : forall L K M, bfctx L K -> {L |- bfree M}* ->
(exists P, {K |- path M P})
H1 : bfctx L K
H3 : {L, [bfree E] |- bfree M}*
H4 : member (bfree E) L
H5 : name E
H6 : member (path E F1) K
H7 : pname F1
============================
exists P, {K |- path M P}
path_exists < case H3.
Subgoal 3:
Variables: L K M F1
IH : forall L K M, bfctx L K -> {L |- bfree M}* ->
(exists P, {K |- path M P})
H1 : bfctx L K
H4 : member (bfree M) L
H5 : name M
H6 : member (path M F1) K
H7 : pname F1
============================
exists P, {K |- path M P}
path_exists < search.
Proof completed.
Abella < Theorem bfree_beta_absurd :
forall L K R N, bfctx L K -> {L |- bfree (beta R N)} -> false.
============================
forall L K R N, bfctx L K -> {L |- bfree (beta R N)} -> false
bfree_beta_absurd < intros.
Variables: L K R N
H1 : bfctx L K
H2 : {L |- bfree (beta R N)}
============================
false
bfree_beta_absurd < case H2.
Variables: L K R N F
H1 : bfctx L K
H3 : {L, [F] |- bfree (beta R N)}
H4 : member F L
============================
false
bfree_beta_absurd < apply bfctx_member1 to H1 H4.
Variables: L K R N E F1
H1 : bfctx L K
H3 : {L, [bfree E] |- bfree (beta R N)}
H4 : member (bfree E) L
H5 : name E
H6 : member (path E F1) K
H7 : pname F1
============================
false
bfree_beta_absurd < case H5.
Variables: L K R N F1
H1 : bfctx (L n1) (K n1)
H3 : {L n1, [bfree n1] |- bfree (beta (R n1) (N n1))}
H4 : member (bfree n1) (L n1)
H6 : member (path n1 F1) (K n1)
H7 : pname F1
============================
false
bfree_beta_absurd < case H3.
Proof completed.
Abella < Theorem path_app :
forall L K M N Y, bfctx L K -> {L |- bfree (app M N)} -> {L |- bfree Y} ->
(forall P, {K |- path (app M N) P} -> {K |- path Y P}) ->
(exists YM YN, Y = app YM YN).
============================
forall L K M N Y, bfctx L K -> {L |- bfree (app M N)} -> {L |- bfree Y} ->
(forall P, {K |- path (app M N) P} -> {K |- path Y P}) ->
(exists YM YN, Y = app YM YN)
path_app < intros.
Variables: L K M N Y
H1 : bfctx L K
H2 : {L |- bfree (app M N)}
H3 : {L |- bfree Y}
H4 : forall P, {K |- path (app M N) P} -> {K |- path Y P}
============================
exists YM YN, Y = app YM YN
path_app < case H2.
Subgoal 1:
Variables: L K M N Y
H1 : bfctx L K
H3 : {L |- bfree Y}
H4 : forall P, {K |- path (app M N) P} -> {K |- path Y P}
H5 : {L |- bfree M}
H6 : {L |- bfree N}
============================
exists YM YN, Y = app YM YN
Subgoal 2 is:
exists YM YN, Y = app YM YN
path_app < apply path_exists to H1 H5.
Subgoal 1:
Variables: L K M N Y P
H1 : bfctx L K
H3 : {L |- bfree Y}
H4 : forall P, {K |- path (app M N) P} -> {K |- path Y P}
H5 : {L |- bfree M}
H6 : {L |- bfree N}
H7 : {K |- path M P}
============================
exists YM YN, Y = app YM YN
Subgoal 2 is:
exists YM YN, Y = app YM YN
path_app < assert {K |- path (app M N) (left P)}.
Subgoal 1:
Variables: L K M N Y P
H1 : bfctx L K
H3 : {L |- bfree Y}
H4 : forall P, {K |- path (app M N) P} -> {K |- path Y P}
H5 : {L |- bfree M}
H6 : {L |- bfree N}
H7 : {K |- path M P}
H8 : {K |- path (app M N) (left P)}
============================
exists YM YN, Y = app YM YN
Subgoal 2 is:
exists YM YN, Y = app YM YN
path_app < apply H4 to H8.
Subgoal 1:
Variables: L K M N Y P
H1 : bfctx L K
H3 : {L |- bfree Y}
H4 : forall P, {K |- path (app M N) P} -> {K |- path Y P}
H5 : {L |- bfree M}
H6 : {L |- bfree N}
H7 : {K |- path M P}
H8 : {K |- path (app M N) (left P)}
H9 : {K |- path Y (left P)}
============================
exists YM YN, Y = app YM YN
Subgoal 2 is:
exists YM YN, Y = app YM YN
path_app < case H9.
Subgoal 1.1:
Variables: L K M N P M1 N1
H1 : bfctx L K
H3 : {L |- bfree (app M1 N1)}
H4 : forall P, {K |- path (app M N) P} -> {K |- path (app M1 N1) P}
H5 : {L |- bfree M}
H6 : {L |- bfree N}
H7 : {K |- path M P}
H8 : {K |- path (app M N) (left P)}
H10 : {K |- path M1 P}
============================
exists YM YN, app M1 N1 = app YM YN
Subgoal 1.2 is:
exists YM YN, beta R N1 = app YM YN
Subgoal 1.3 is:
exists YM YN, Y = app YM YN
Subgoal 2 is:
exists YM YN, Y = app YM YN
path_app < search.
Subgoal 1.2:
Variables: L K M N P R N1
H1 : bfctx L K
H3 : {L |- bfree (beta R N1)}
H4 : forall P, {K |- path (app M N) P} -> {K |- path (beta R N1) P}
H5 : {L |- bfree M}
H6 : {L |- bfree N}
H7 : {K |- path M P}
H8 : {K |- path (app M N) (left P)}
H10 : {K, pi q\path N1 q => path n1 q |- path (R n1) (left P)}
============================
exists YM YN, beta R N1 = app YM YN
Subgoal 1.3 is:
exists YM YN, Y = app YM YN
Subgoal 2 is:
exists YM YN, Y = app YM YN
path_app < apply bfree_beta_absurd to H1 H3.
Subgoal 1.3:
Variables: L K M N Y P F
H1 : bfctx L K
H3 : {L |- bfree Y}
H4 : forall P, {K |- path (app M N) P} -> {K |- path Y P}
H5 : {L |- bfree M}
H6 : {L |- bfree N}
H7 : {K |- path M P}
H8 : {K |- path (app M N) (left P)}
H10 : {K, [F] |- path Y (left P)}
H11 : member F K
============================
exists YM YN, Y = app YM YN
Subgoal 2 is:
exists YM YN, Y = app YM YN
path_app < apply bfctx_member2 to H1 H11.
Subgoal 1.3:
Variables: L K M N Y P E F1
H1 : bfctx L K
H3 : {L |- bfree Y}
H4 : forall P, {K |- path (app M N) P} -> {K |- path Y P}
H5 : {L |- bfree M}
H6 : {L |- bfree N}
H7 : {K |- path M P}
H8 : {K |- path (app M N) (left P)}
H10 : {K, [path E F1] |- path Y (left P)}
H11 : member (path E F1) K
H12 : name E
H13 : pname F1
============================
exists YM YN, Y = app YM YN
Subgoal 2 is:
exists YM YN, Y = app YM YN
path_app < case H13.
Subgoal 1.3:
Variables: L K M N Y P E
H1 : bfctx (L n1) (K n1)
H3 : {L n1 |- bfree Y}
H4 : forall P, {K n1 |- path (app M N) P} -> {K n1 |- path Y P}
H5 : {L n1 |- bfree M}
H6 : {L n1 |- bfree N}
H7 : {K n1 |- path M (P n1)}
H8 : {K n1 |- path (app M N) (left (P n1))}
H10 : {K n1, [path E n1] |- path Y (left (P n1))}
H11 : member (path E n1) (K n1)
H12 : name E
============================
exists YM YN, Y = app YM YN
Subgoal 2 is:
exists YM YN, Y = app YM YN
path_app < case H10.
Subgoal 2:
Variables: L K M N Y F
H1 : bfctx L K
H3 : {L |- bfree Y}
H4 : forall P, {K |- path (app M N) P} -> {K |- path Y P}
H5 : {L, [F] |- bfree (app M N)}
H6 : member F L
============================
exists YM YN, Y = app YM YN
path_app < apply bfctx_member1 to H1 H6.
Subgoal 2:
Variables: L K M N Y E F1
H1 : bfctx L K
H3 : {L |- bfree Y}
H4 : forall P, {K |- path (app M N) P} -> {K |- path Y P}
H5 : {L, [bfree E] |- bfree (app M N)}
H6 : member (bfree E) L
H7 : name E
H8 : member (path E F1) K
H9 : pname F1
============================
exists YM YN, Y = app YM YN
path_app < case H5.
Subgoal 2:
Variables: L K M N Y F1
H1 : bfctx L K
H3 : {L |- bfree Y}
H4 : forall P, {K |- path (app M N) P} -> {K |- path Y P}
H6 : member (bfree (app M N)) L
H7 : name (app M N)
H8 : member (path (app M N) F1) K
H9 : pname F1
============================
exists YM YN, Y = app YM YN
path_app < case H7.
Proof completed.
Abella < Theorem path_abs :
forall L K R Y, bfctx L K -> {L |- bfree (abs R)} -> {L |- bfree Y} ->
(forall P, {K |- path (abs R) P} -> {K |- path Y P}) ->
(exists YR, Y = abs YR).
============================
forall L K R Y, bfctx L K -> {L |- bfree (abs R)} -> {L |- bfree Y} ->
(forall P, {K |- path (abs R) P} -> {K |- path Y P}) ->
(exists YR, Y = abs YR)
path_abs < intros.
Variables: L K R Y
H1 : bfctx L K
H2 : {L |- bfree (abs R)}
H3 : {L |- bfree Y}
H4 : forall P, {K |- path (abs R) P} -> {K |- path Y P}
============================
exists YR, Y = abs YR
path_abs < case H2.
Subgoal 1:
Variables: L K R Y
H1 : bfctx L K
H3 : {L |- bfree Y}
H4 : forall P, {K |- path (abs R) P} -> {K |- path Y P}
H5 : {L, bfree n1 |- bfree (R n1)}
============================
exists YR, Y = abs YR
Subgoal 2 is:
exists YR, Y = abs YR
path_abs < assert bfctx (bfree n1 :: L) (path n1 n2 :: K).
Subgoal 1:
Variables: L K R Y
H1 : bfctx L K
H3 : {L |- bfree Y}
H4 : forall P, {K |- path (abs R) P} -> {K |- path Y P}
H5 : {L, bfree n1 |- bfree (R n1)}
H6 : bfctx (bfree n1 :: L) (path n1 n2 :: K)
============================
exists YR, Y = abs YR
Subgoal 2 is:
exists YR, Y = abs YR
path_abs < apply path_exists to H6 H5.
Subgoal 1:
Variables: L K R Y P
H1 : bfctx L K
H3 : {L |- bfree Y}
H4 : forall P, {K |- path (abs R) P} -> {K |- path Y P}
H5 : {L, bfree n1 |- bfree (R n1)}
H6 : bfctx (bfree n1 :: L) (path n1 n2 :: K)
H7 : {K, path n1 n2 |- path (R n1) (P n2)}
============================
exists YR, Y = abs YR
Subgoal 2 is:
exists YR, Y = abs YR
path_abs < assert {K |- path (abs R) (bnd P)}.
Subgoal 1:
Variables: L K R Y P
H1 : bfctx L K
H3 : {L |- bfree Y}
H4 : forall P, {K |- path (abs R) P} -> {K |- path Y P}
H5 : {L, bfree n1 |- bfree (R n1)}
H6 : bfctx (bfree n1 :: L) (path n1 n2 :: K)
H7 : {K, path n1 n2 |- path (R n1) (P n2)}
H8 : {K |- path (abs R) (bnd P)}
============================
exists YR, Y = abs YR
Subgoal 2 is:
exists YR, Y = abs YR
path_abs < apply H4 to H8.
Subgoal 1:
Variables: L K R Y P
H1 : bfctx L K
H3 : {L |- bfree Y}
H4 : forall P, {K |- path (abs R) P} -> {K |- path Y P}
H5 : {L, bfree n1 |- bfree (R n1)}
H6 : bfctx (bfree n1 :: L) (path n1 n2 :: K)
H7 : {K, path n1 n2 |- path (R n1) (P n2)}
H8 : {K |- path (abs R) (bnd P)}
H9 : {K |- path Y (bnd P)}
============================
exists YR, Y = abs YR
Subgoal 2 is:
exists YR, Y = abs YR
path_abs < case H9.
Subgoal 1.1:
Variables: L K R P M
H1 : bfctx L K
H3 : {L |- bfree (abs M)}
H4 : forall P, {K |- path (abs R) P} -> {K |- path (abs M) P}
H5 : {L, bfree n1 |- bfree (R n1)}
H6 : bfctx (bfree n1 :: L) (path n1 n2 :: K)
H7 : {K, path n1 n2 |- path (R n1) (P n2)}
H8 : {K |- path (abs R) (bnd P)}
H10 : {K, path n1 n2 |- path (M n1) (P n2)}
============================
exists YR, abs M = abs YR
Subgoal 1.2 is:
exists YR, beta R1 N = abs YR
Subgoal 1.3 is:
exists YR, Y = abs YR
Subgoal 2 is:
exists YR, Y = abs YR
path_abs < search.
Subgoal 1.2:
Variables: L K R P R1 N
H1 : bfctx L K
H3 : {L |- bfree (beta R1 N)}
H4 : forall P, {K |- path (abs R) P} -> {K |- path (beta R1 N) P}
H5 : {L, bfree n1 |- bfree (R n1)}
H6 : bfctx (bfree n1 :: L) (path n1 n2 :: K)
H7 : {K, path n1 n2 |- path (R n1) (P n2)}
H8 : {K |- path (abs R) (bnd P)}
H10 : {K, pi q\path N q => path n1 q |- path (R1 n1) (bnd P)}
============================
exists YR, beta R1 N = abs YR
Subgoal 1.3 is:
exists YR, Y = abs YR
Subgoal 2 is:
exists YR, Y = abs YR
path_abs < apply bfree_beta_absurd to H1 H3.
Subgoal 1.3:
Variables: L K R Y P F
H1 : bfctx L K
H3 : {L |- bfree Y}
H4 : forall P, {K |- path (abs R) P} -> {K |- path Y P}
H5 : {L, bfree n1 |- bfree (R n1)}
H6 : bfctx (bfree n1 :: L) (path n1 n2 :: K)
H7 : {K, path n1 n2 |- path (R n1) (P n2)}
H8 : {K |- path (abs R) (bnd P)}
H10 : {K, [F] |- path Y (bnd P)}
H11 : member F K
============================
exists YR, Y = abs YR
Subgoal 2 is:
exists YR, Y = abs YR
path_abs < apply bfctx_member2 to H1 H11.
Subgoal 1.3:
Variables: L K R Y P E F1
H1 : bfctx L K
H3 : {L |- bfree Y}
H4 : forall P, {K |- path (abs R) P} -> {K |- path Y P}
H5 : {L, bfree n1 |- bfree (R n1)}
H6 : bfctx (bfree n1 :: L) (path n1 n2 :: K)
H7 : {K, path n1 n2 |- path (R n1) (P n2)}
H8 : {K |- path (abs R) (bnd P)}
H10 : {K, [path E F1] |- path Y (bnd P)}
H11 : member (path E F1) K
H12 : name E
H13 : pname F1
============================
exists YR, Y = abs YR
Subgoal 2 is:
exists YR, Y = abs YR
path_abs < case H10.
Subgoal 1.3:
Variables: L K R Y P
H1 : bfctx L K
H3 : {L |- bfree Y}
H4 : forall P, {K |- path (abs R) P} -> {K |- path Y P}
H5 : {L, bfree n1 |- bfree (R n1)}
H6 : bfctx (bfree n1 :: L) (path n1 n2 :: K)
H7 : {K, path n1 n2 |- path (R n1) (P n2)}
H8 : {K |- path (abs R) (bnd P)}
H11 : member (path Y (bnd P)) K
H12 : name Y
H13 : pname (bnd P)
============================
exists YR, Y = abs YR
Subgoal 2 is:
exists YR, Y = abs YR
path_abs < case H13.
Subgoal 2:
Variables: L K R Y F
H1 : bfctx L K
H3 : {L |- bfree Y}
H4 : forall P, {K |- path (abs R) P} -> {K |- path Y P}
H5 : {L, [F] |- bfree (abs R)}
H6 : member F L
============================
exists YR, Y = abs YR
path_abs < apply bfctx_member1 to H1 H6.
Subgoal 2:
Variables: L K R Y E F1
H1 : bfctx L K
H3 : {L |- bfree Y}
H4 : forall P, {K |- path (abs R) P} -> {K |- path Y P}
H5 : {L, [bfree E] |- bfree (abs R)}
H6 : member (bfree E) L
H7 : name E
H8 : member (path E F1) K
H9 : pname F1
============================
exists YR, Y = abs YR
path_abs < case H5.
Subgoal 2:
Variables: L K R Y F1
H1 : bfctx L K
H3 : {L |- bfree Y}
H4 : forall P, {K |- path (abs R) P} -> {K |- path Y P}
H6 : member (bfree (abs R)) L
H7 : name (abs R)
H8 : member (path (abs R) F1) K
H9 : pname F1
============================
exists YR, Y = abs YR
path_abs < case H7.
Proof completed.
Abella < Theorem bfree_sames :
forall L K M N, bfctx L K -> {L |- bfree M} -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N.
============================
forall L K M N, bfctx L K -> {L |- bfree M} -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
bfree_sames < induction on 2.
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
============================
forall L K M N, bfctx L K -> {L |- bfree M}@ -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
bfree_sames < intros.
Variables: L K M N
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree M}@
H3 : {L |- bfree N}
H4 : forall p, {K |- path M p} -> {K |- path N p}
============================
M = N
bfree_sames < case H2 (keep).
Subgoal 1:
Variables: L K N M1
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree (abs M1)}@
H3 : {L |- bfree N}
H4 : forall p, {K |- path (abs M1) p} -> {K |- path N p}
H5 : {L, bfree n1 |- bfree (M1 n1)}*
============================
abs M1 = N
Subgoal 2 is:
app M1 N1 = N
Subgoal 3 is:
M = N
bfree_sames < apply path_abs to H1 H2 H3 H4.
Subgoal 1:
Variables: L K M1 YR
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree (abs M1)}@
H3 : {L |- bfree (abs YR)}
H4 : forall p, {K |- path (abs M1) p} -> {K |- path (abs YR) p}
H5 : {L, bfree n1 |- bfree (M1 n1)}*
============================
abs M1 = abs YR
Subgoal 2 is:
app M1 N1 = N
Subgoal 3 is:
M = N
bfree_sames < case H3.
Subgoal 1.1:
Variables: L K M1 YR
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree (abs M1)}@
H4 : forall p, {K |- path (abs M1) p} -> {K |- path (abs YR) p}
H5 : {L, bfree n1 |- bfree (M1 n1)}*
H6 : {L, bfree n1 |- bfree (YR n1)}
============================
abs M1 = abs YR
Subgoal 1.2 is:
abs M1 = abs YR
Subgoal 2 is:
app M1 N1 = N
Subgoal 3 is:
M = N
bfree_sames < assert forall p, {K, path n1 n2 |- path (M1 n1) p} ->
{K, path n1 n2 |- path (YR n1) p}.
Subgoal 1.1.1:
Variables: L K M1 YR
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree (abs M1)}@
H4 : forall p, {K |- path (abs M1) p} -> {K |- path (abs YR) p}
H5 : {L, bfree n1 |- bfree (M1 n1)}*
H6 : {L, bfree n1 |- bfree (YR n1)}
============================
forall p, {K, path n1 n2 |- path (M1 n1) p} ->
{K, path n1 n2 |- path (YR n1) p}
Subgoal 1.1 is:
abs M1 = abs YR
Subgoal 1.2 is:
abs M1 = abs YR
Subgoal 2 is:
app M1 N1 = N
Subgoal 3 is:
M = N
bfree_sames < intros.
Subgoal 1.1.1:
Variables: L K M1 YR p
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree (abs M1)}@
H4 : forall p, {K |- path (abs M1) p} -> {K |- path (abs YR) p}
H5 : {L, bfree n1 |- bfree (M1 n1)}*
H6 : {L, bfree n1 |- bfree (YR n1)}
H7 : {K, path n1 n2 |- path (M1 n1) (p n2)}
============================
{K, path n1 n2 |- path (YR n1) (p n2)}
Subgoal 1.1 is:
abs M1 = abs YR
Subgoal 1.2 is:
abs M1 = abs YR
Subgoal 2 is:
app M1 N1 = N
Subgoal 3 is:
M = N
bfree_sames < assert {K |- path (abs M1) (bnd p)}.
Subgoal 1.1.1:
Variables: L K M1 YR p
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree (abs M1)}@
H4 : forall p, {K |- path (abs M1) p} -> {K |- path (abs YR) p}
H5 : {L, bfree n1 |- bfree (M1 n1)}*
H6 : {L, bfree n1 |- bfree (YR n1)}
H7 : {K, path n1 n2 |- path (M1 n1) (p n2)}
H8 : {K |- path (abs M1) (bnd p)}
============================
{K, path n1 n2 |- path (YR n1) (p n2)}
Subgoal 1.1 is:
abs M1 = abs YR
Subgoal 1.2 is:
abs M1 = abs YR
Subgoal 2 is:
app M1 N1 = N
Subgoal 3 is:
M = N
bfree_sames < apply H4 to H8.
Subgoal 1.1.1:
Variables: L K M1 YR p
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree (abs M1)}@
H4 : forall p, {K |- path (abs M1) p} -> {K |- path (abs YR) p}
H5 : {L, bfree n1 |- bfree (M1 n1)}*
H6 : {L, bfree n1 |- bfree (YR n1)}
H7 : {K, path n1 n2 |- path (M1 n1) (p n2)}
H8 : {K |- path (abs M1) (bnd p)}
H9 : {K |- path (abs YR) (bnd p)}
============================
{K, path n1 n2 |- path (YR n1) (p n2)}
Subgoal 1.1 is:
abs M1 = abs YR
Subgoal 1.2 is:
abs M1 = abs YR
Subgoal 2 is:
app M1 N1 = N
Subgoal 3 is:
M = N
bfree_sames < case H9.
Subgoal 1.1.1.1:
Variables: L K M1 YR p
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree (abs M1)}@
H4 : forall p, {K |- path (abs M1) p} -> {K |- path (abs YR) p}
H5 : {L, bfree n1 |- bfree (M1 n1)}*
H6 : {L, bfree n1 |- bfree (YR n1)}
H7 : {K, path n1 n2 |- path (M1 n1) (p n2)}
H8 : {K |- path (abs M1) (bnd p)}
H10 : {K, path n1 n2 |- path (YR n1) (p n2)}
============================
{K, path n1 n2 |- path (YR n1) (p n2)}
Subgoal 1.1.1.2 is:
{K, path n1 n2 |- path (YR n1) (p n2)}
Subgoal 1.1 is:
abs M1 = abs YR
Subgoal 1.2 is:
abs M1 = abs YR
Subgoal 2 is:
app M1 N1 = N
Subgoal 3 is:
M = N
bfree_sames < search.
Subgoal 1.1.1.2:
Variables: L K M1 YR p F
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree (abs M1)}@
H4 : forall p, {K |- path (abs M1) p} -> {K |- path (abs YR) p}
H5 : {L, bfree n1 |- bfree (M1 n1)}*
H6 : {L, bfree n1 |- bfree (YR n1)}
H7 : {K, path n1 n2 |- path (M1 n1) (p n2)}
H8 : {K |- path (abs M1) (bnd p)}
H10 : {K, [F] |- path (abs YR) (bnd p)}
H11 : member F K
============================
{K, path n1 n2 |- path (YR n1) (p n2)}
Subgoal 1.1 is:
abs M1 = abs YR
Subgoal 1.2 is:
abs M1 = abs YR
Subgoal 2 is:
app M1 N1 = N
Subgoal 3 is:
M = N
bfree_sames < apply bfctx_member2 to H1 H11.
Subgoal 1.1.1.2:
Variables: L K M1 YR p E F1
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree (abs M1)}@
H4 : forall p, {K |- path (abs M1) p} -> {K |- path (abs YR) p}
H5 : {L, bfree n1 |- bfree (M1 n1)}*
H6 : {L, bfree n1 |- bfree (YR n1)}
H7 : {K, path n1 n2 |- path (M1 n1) (p n2)}
H8 : {K |- path (abs M1) (bnd p)}
H10 : {K, [path E F1] |- path (abs YR) (bnd p)}
H11 : member (path E F1) K
H12 : name E
H13 : pname F1
============================
{K, path n1 n2 |- path (YR n1) (p n2)}
Subgoal 1.1 is:
abs M1 = abs YR
Subgoal 1.2 is:
abs M1 = abs YR
Subgoal 2 is:
app M1 N1 = N
Subgoal 3 is:
M = N
bfree_sames < case H13.
Subgoal 1.1.1.2:
Variables: L K M1 YR p E
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx (L n3) (K n3)
H2 : {L n3 |- bfree (abs M1)}@
H4 : forall p, {K n3 |- path (abs M1) p} -> {K n3 |- path (abs YR) p}
H5 : {L n3, bfree n1 |- bfree (M1 n1)}*
H6 : {L n3, bfree n1 |- bfree (YR n1)}
H7 : {K n3, path n1 n2 |- path (M1 n1) (p n3 n2)}
H8 : {K n3 |- path (abs M1) (bnd (p n3))}
H10 : {K n3, [path E n3] |- path (abs YR) (bnd (p n3))}
H11 : member (path E n3) (K n3)
H12 : name E
============================
{K n3, path n1 n2 |- path (YR n1) (p n3 n2)}
Subgoal 1.1 is:
abs M1 = abs YR
Subgoal 1.2 is:
abs M1 = abs YR
Subgoal 2 is:
app M1 N1 = N
Subgoal 3 is:
M = N
bfree_sames < case H10.
Subgoal 1.1:
Variables: L K M1 YR
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree (abs M1)}@
H4 : forall p, {K |- path (abs M1) p} -> {K |- path (abs YR) p}
H5 : {L, bfree n1 |- bfree (M1 n1)}*
H6 : {L, bfree n1 |- bfree (YR n1)}
H7 : forall p, {K, path n1 n2 |- path (M1 n1) p} ->
{K, path n1 n2 |- path (YR n1) p}
============================
abs M1 = abs YR
Subgoal 1.2 is:
abs M1 = abs YR
Subgoal 2 is:
app M1 N1 = N
Subgoal 3 is:
M = N
bfree_sames < assert bfctx (bfree n1 :: L) (path n1 n2 :: K).
Subgoal 1.1:
Variables: L K M1 YR
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree (abs M1)}@
H4 : forall p, {K |- path (abs M1) p} -> {K |- path (abs YR) p}
H5 : {L, bfree n1 |- bfree (M1 n1)}*
H6 : {L, bfree n1 |- bfree (YR n1)}
H7 : forall p, {K, path n1 n2 |- path (M1 n1) p} ->
{K, path n1 n2 |- path (YR n1) p}
H8 : bfctx (bfree n1 :: L) (path n1 n2 :: K)
============================
abs M1 = abs YR
Subgoal 1.2 is:
abs M1 = abs YR
Subgoal 2 is:
app M1 N1 = N
Subgoal 3 is:
M = N
bfree_sames < apply IH to H8 H5 H6 H7.
Subgoal 1.1:
Variables: L K YR
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree (abs (z1\YR z1))}@
H4 : forall p, {K |- path (abs (z1\YR z1)) p} -> {K |- path (abs YR) p}
H5 : {L, bfree n1 |- bfree (YR n1)}*
H6 : {L, bfree n1 |- bfree (YR n1)}
H7 : forall p, {K, path n1 n2 |- path (YR n1) p} ->
{K, path n1 n2 |- path (YR n1) p}
H8 : bfctx (bfree n1 :: L) (path n1 n2 :: K)
============================
abs (z1\YR z1) = abs YR
Subgoal 1.2 is:
abs M1 = abs YR
Subgoal 2 is:
app M1 N1 = N
Subgoal 3 is:
M = N
bfree_sames < search.
Subgoal 1.2:
Variables: L K M1 YR F
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree (abs M1)}@
H4 : forall p, {K |- path (abs M1) p} -> {K |- path (abs YR) p}
H5 : {L, bfree n1 |- bfree (M1 n1)}*
H6 : {L, [F] |- bfree (abs YR)}
H7 : member F L
============================
abs M1 = abs YR
Subgoal 2 is:
app M1 N1 = N
Subgoal 3 is:
M = N
bfree_sames < apply bfctx_member1 to H1 H7.
Subgoal 1.2:
Variables: L K M1 YR E F1
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree (abs M1)}@
H4 : forall p, {K |- path (abs M1) p} -> {K |- path (abs YR) p}
H5 : {L, bfree n1 |- bfree (M1 n1)}*
H6 : {L, [bfree E] |- bfree (abs YR)}
H7 : member (bfree E) L
H8 : name E
H9 : member (path E F1) K
H10 : pname F1
============================
abs M1 = abs YR
Subgoal 2 is:
app M1 N1 = N
Subgoal 3 is:
M = N
bfree_sames < case H8.
Subgoal 1.2:
Variables: L K M1 YR F1
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx (L n2) (K n2)
H2 : {L n2 |- bfree (abs (M1 n2))}@
H4 : forall p, {K n2 |- path (abs (M1 n2)) p} ->
{K n2 |- path (abs (YR n2)) p}
H5 : {L n2, bfree n1 |- bfree (M1 n2 n1)}*
H6 : {L n2, [bfree n2] |- bfree (abs (YR n2))}
H7 : member (bfree n2) (L n2)
H9 : member (path n2 F1) (K n2)
H10 : pname F1
============================
abs (M1 n2) = abs (YR n2)
Subgoal 2 is:
app M1 N1 = N
Subgoal 3 is:
M = N
bfree_sames < case H6.
Subgoal 2:
Variables: L K N N1 M1
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree (app M1 N1)}@
H3 : {L |- bfree N}
H4 : forall p, {K |- path (app M1 N1) p} -> {K |- path N p}
H5 : {L |- bfree M1}*
H6 : {L |- bfree N1}*
============================
app M1 N1 = N
Subgoal 3 is:
M = N
bfree_sames < apply path_app to H1 H2 H3 H4.
Subgoal 2:
Variables: L K N1 M1 YM YN
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree (app M1 N1)}@
H3 : {L |- bfree (app YM YN)}
H4 : forall p, {K |- path (app M1 N1) p} -> {K |- path (app YM YN) p}
H5 : {L |- bfree M1}*
H6 : {L |- bfree N1}*
============================
app M1 N1 = app YM YN
Subgoal 3 is:
M = N
bfree_sames < case H3.
Subgoal 2.1:
Variables: L K N1 M1 YM YN
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree (app M1 N1)}@
H4 : forall p, {K |- path (app M1 N1) p} -> {K |- path (app YM YN) p}
H5 : {L |- bfree M1}*
H6 : {L |- bfree N1}*
H7 : {L |- bfree YM}
H8 : {L |- bfree YN}
============================
app M1 N1 = app YM YN
Subgoal 2.2 is:
app M1 N1 = app YM YN
Subgoal 3 is:
M = N
bfree_sames < assert forall p, {K |- path M1 p} -> {K |- path YM p}.
Subgoal 2.1.1:
Variables: L K N1 M1 YM YN
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree (app M1 N1)}@
H4 : forall p, {K |- path (app M1 N1) p} -> {K |- path (app YM YN) p}
H5 : {L |- bfree M1}*
H6 : {L |- bfree N1}*
H7 : {L |- bfree YM}
H8 : {L |- bfree YN}
============================
forall p, {K |- path M1 p} -> {K |- path YM p}
Subgoal 2.1 is:
app M1 N1 = app YM YN
Subgoal 2.2 is:
app M1 N1 = app YM YN
Subgoal 3 is:
M = N
bfree_sames < intros.
Subgoal 2.1.1:
Variables: L K N1 M1 YM YN p
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree (app M1 N1)}@
H4 : forall p, {K |- path (app M1 N1) p} -> {K |- path (app YM YN) p}
H5 : {L |- bfree M1}*
H6 : {L |- bfree N1}*
H7 : {L |- bfree YM}
H8 : {L |- bfree YN}
H9 : {K |- path M1 p}
============================
{K |- path YM p}
Subgoal 2.1 is:
app M1 N1 = app YM YN
Subgoal 2.2 is:
app M1 N1 = app YM YN
Subgoal 3 is:
M = N
bfree_sames < assert {K |- path (app M1 N1) (left p)}.
Subgoal 2.1.1:
Variables: L K N1 M1 YM YN p
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree (app M1 N1)}@
H4 : forall p, {K |- path (app M1 N1) p} -> {K |- path (app YM YN) p}
H5 : {L |- bfree M1}*
H6 : {L |- bfree N1}*
H7 : {L |- bfree YM}
H8 : {L |- bfree YN}
H9 : {K |- path M1 p}
H10 : {K |- path (app M1 N1) (left p)}
============================
{K |- path YM p}
Subgoal 2.1 is:
app M1 N1 = app YM YN
Subgoal 2.2 is:
app M1 N1 = app YM YN
Subgoal 3 is:
M = N
bfree_sames < apply H4 to H10.
Subgoal 2.1.1:
Variables: L K N1 M1 YM YN p
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree (app M1 N1)}@
H4 : forall p, {K |- path (app M1 N1) p} -> {K |- path (app YM YN) p}
H5 : {L |- bfree M1}*
H6 : {L |- bfree N1}*
H7 : {L |- bfree YM}
H8 : {L |- bfree YN}
H9 : {K |- path M1 p}
H10 : {K |- path (app M1 N1) (left p)}
H11 : {K |- path (app YM YN) (left p)}
============================
{K |- path YM p}
Subgoal 2.1 is:
app M1 N1 = app YM YN
Subgoal 2.2 is:
app M1 N1 = app YM YN
Subgoal 3 is:
M = N
bfree_sames < case H11.
Subgoal 2.1.1.1:
Variables: L K N1 M1 YM YN p
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree (app M1 N1)}@
H4 : forall p, {K |- path (app M1 N1) p} -> {K |- path (app YM YN) p}
H5 : {L |- bfree M1}*
H6 : {L |- bfree N1}*
H7 : {L |- bfree YM}
H8 : {L |- bfree YN}
H9 : {K |- path M1 p}
H10 : {K |- path (app M1 N1) (left p)}
H12 : {K |- path YM p}
============================
{K |- path YM p}
Subgoal 2.1.1.2 is:
{K |- path YM p}
Subgoal 2.1 is:
app M1 N1 = app YM YN
Subgoal 2.2 is:
app M1 N1 = app YM YN
Subgoal 3 is:
M = N
bfree_sames < search.
Subgoal 2.1.1.2:
Variables: L K N1 M1 YM YN p F
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree (app M1 N1)}@
H4 : forall p, {K |- path (app M1 N1) p} -> {K |- path (app YM YN) p}
H5 : {L |- bfree M1}*
H6 : {L |- bfree N1}*
H7 : {L |- bfree YM}
H8 : {L |- bfree YN}
H9 : {K |- path M1 p}
H10 : {K |- path (app M1 N1) (left p)}
H12 : {K, [F] |- path (app YM YN) (left p)}
H13 : member F K
============================
{K |- path YM p}
Subgoal 2.1 is:
app M1 N1 = app YM YN
Subgoal 2.2 is:
app M1 N1 = app YM YN
Subgoal 3 is:
M = N
bfree_sames < apply bfctx_member2 to H1 H13.
Subgoal 2.1.1.2:
Variables: L K N1 M1 YM YN p E F1
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree (app M1 N1)}@
H4 : forall p, {K |- path (app M1 N1) p} -> {K |- path (app YM YN) p}
H5 : {L |- bfree M1}*
H6 : {L |- bfree N1}*
H7 : {L |- bfree YM}
H8 : {L |- bfree YN}
H9 : {K |- path M1 p}
H10 : {K |- path (app M1 N1) (left p)}
H12 : {K, [path E F1] |- path (app YM YN) (left p)}
H13 : member (path E F1) K
H14 : name E
H15 : pname F1
============================
{K |- path YM p}
Subgoal 2.1 is:
app M1 N1 = app YM YN
Subgoal 2.2 is:
app M1 N1 = app YM YN
Subgoal 3 is:
M = N
bfree_sames < case H15.
Subgoal 2.1.1.2:
Variables: L K N1 M1 YM YN p E
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx (L n1) (K n1)
H2 : {L n1 |- bfree (app M1 N1)}@
H4 : forall p, {K n1 |- path (app M1 N1) p} -> {K n1 |- path (app YM YN) p}
H5 : {L n1 |- bfree M1}*
H6 : {L n1 |- bfree N1}*
H7 : {L n1 |- bfree YM}
H8 : {L n1 |- bfree YN}
H9 : {K n1 |- path M1 (p n1)}
H10 : {K n1 |- path (app M1 N1) (left (p n1))}
H12 : {K n1, [path E n1] |- path (app YM YN) (left (p n1))}
H13 : member (path E n1) (K n1)
H14 : name E
============================
{K n1 |- path YM (p n1)}
Subgoal 2.1 is:
app M1 N1 = app YM YN
Subgoal 2.2 is:
app M1 N1 = app YM YN
Subgoal 3 is:
M = N
bfree_sames < case H12.
Subgoal 2.1:
Variables: L K N1 M1 YM YN
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree (app M1 N1)}@
H4 : forall p, {K |- path (app M1 N1) p} -> {K |- path (app YM YN) p}
H5 : {L |- bfree M1}*
H6 : {L |- bfree N1}*
H7 : {L |- bfree YM}
H8 : {L |- bfree YN}
H9 : forall p, {K |- path M1 p} -> {K |- path YM p}
============================
app M1 N1 = app YM YN
Subgoal 2.2 is:
app M1 N1 = app YM YN
Subgoal 3 is:
M = N
bfree_sames < apply IH to H1 H5 H7 H9.
Subgoal 2.1:
Variables: L K N1 YM YN
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree (app YM N1)}@
H4 : forall p, {K |- path (app YM N1) p} -> {K |- path (app YM YN) p}
H5 : {L |- bfree YM}*
H6 : {L |- bfree N1}*
H7 : {L |- bfree YM}
H8 : {L |- bfree YN}
H9 : forall p, {K |- path YM p} -> {K |- path YM p}
============================
app YM N1 = app YM YN
Subgoal 2.2 is:
app M1 N1 = app YM YN
Subgoal 3 is:
M = N
bfree_sames < assert forall p, {K |- path N1 p} -> {K |- path YN p}.
Subgoal 2.1.2:
Variables: L K N1 YM YN
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree (app YM N1)}@
H4 : forall p, {K |- path (app YM N1) p} -> {K |- path (app YM YN) p}
H5 : {L |- bfree YM}*
H6 : {L |- bfree N1}*
H7 : {L |- bfree YM}
H8 : {L |- bfree YN}
H9 : forall p, {K |- path YM p} -> {K |- path YM p}
============================
forall p, {K |- path N1 p} -> {K |- path YN p}
Subgoal 2.1 is:
app YM N1 = app YM YN
Subgoal 2.2 is:
app M1 N1 = app YM YN
Subgoal 3 is:
M = N
bfree_sames < intros.
Subgoal 2.1.2:
Variables: L K N1 YM YN p
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree (app YM N1)}@
H4 : forall p, {K |- path (app YM N1) p} -> {K |- path (app YM YN) p}
H5 : {L |- bfree YM}*
H6 : {L |- bfree N1}*
H7 : {L |- bfree YM}
H8 : {L |- bfree YN}
H9 : forall p, {K |- path YM p} -> {K |- path YM p}
H10 : {K |- path N1 p}
============================
{K |- path YN p}
Subgoal 2.1 is:
app YM N1 = app YM YN
Subgoal 2.2 is:
app M1 N1 = app YM YN
Subgoal 3 is:
M = N
bfree_sames < assert {K |- path (app M1 N1) (right p)}.
Subgoal 2.1.2:
Variables: L K N1 YM YN p
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree (app YM N1)}@
H4 : forall p, {K |- path (app YM N1) p} -> {K |- path (app YM YN) p}
H5 : {L |- bfree YM}*
H6 : {L |- bfree N1}*
H7 : {L |- bfree YM}
H8 : {L |- bfree YN}
H9 : forall p, {K |- path YM p} -> {K |- path YM p}
H10 : {K |- path N1 p}
H11 : {K |- path (app YM N1) (right p)}
============================
{K |- path YN p}
Subgoal 2.1 is:
app YM N1 = app YM YN
Subgoal 2.2 is:
app M1 N1 = app YM YN
Subgoal 3 is:
M = N
bfree_sames < apply H4 to H11.
Subgoal 2.1.2:
Variables: L K N1 YM YN p
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree (app YM N1)}@
H4 : forall p, {K |- path (app YM N1) p} -> {K |- path (app YM YN) p}
H5 : {L |- bfree YM}*
H6 : {L |- bfree N1}*
H7 : {L |- bfree YM}
H8 : {L |- bfree YN}
H9 : forall p, {K |- path YM p} -> {K |- path YM p}
H10 : {K |- path N1 p}
H11 : {K |- path (app YM N1) (right p)}
H12 : {K |- path (app YM YN) (right p)}
============================
{K |- path YN p}
Subgoal 2.1 is:
app YM N1 = app YM YN
Subgoal 2.2 is:
app M1 N1 = app YM YN
Subgoal 3 is:
M = N
bfree_sames < case H12.
Subgoal 2.1.2.1:
Variables: L K N1 YM YN p
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree (app YM N1)}@
H4 : forall p, {K |- path (app YM N1) p} -> {K |- path (app YM YN) p}
H5 : {L |- bfree YM}*
H6 : {L |- bfree N1}*
H7 : {L |- bfree YM}
H8 : {L |- bfree YN}
H9 : forall p, {K |- path YM p} -> {K |- path YM p}
H10 : {K |- path N1 p}
H11 : {K |- path (app YM N1) (right p)}
H13 : {K |- path YN p}
============================
{K |- path YN p}
Subgoal 2.1.2.2 is:
{K |- path YN p}
Subgoal 2.1 is:
app YM N1 = app YM YN
Subgoal 2.2 is:
app M1 N1 = app YM YN
Subgoal 3 is:
M = N
bfree_sames < search.
Subgoal 2.1.2.2:
Variables: L K N1 YM YN p F
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree (app YM N1)}@
H4 : forall p, {K |- path (app YM N1) p} -> {K |- path (app YM YN) p}
H5 : {L |- bfree YM}*
H6 : {L |- bfree N1}*
H7 : {L |- bfree YM}
H8 : {L |- bfree YN}
H9 : forall p, {K |- path YM p} -> {K |- path YM p}
H10 : {K |- path N1 p}
H11 : {K |- path (app YM N1) (right p)}
H13 : {K, [F] |- path (app YM YN) (right p)}
H14 : member F K
============================
{K |- path YN p}
Subgoal 2.1 is:
app YM N1 = app YM YN
Subgoal 2.2 is:
app M1 N1 = app YM YN
Subgoal 3 is:
M = N
bfree_sames < apply bfctx_member2 to H1 H14.
Subgoal 2.1.2.2:
Variables: L K N1 YM YN p E F1
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree (app YM N1)}@
H4 : forall p, {K |- path (app YM N1) p} -> {K |- path (app YM YN) p}
H5 : {L |- bfree YM}*
H6 : {L |- bfree N1}*
H7 : {L |- bfree YM}
H8 : {L |- bfree YN}
H9 : forall p, {K |- path YM p} -> {K |- path YM p}
H10 : {K |- path N1 p}
H11 : {K |- path (app YM N1) (right p)}
H13 : {K, [path E F1] |- path (app YM YN) (right p)}
H14 : member (path E F1) K
H15 : name E
H16 : pname F1
============================
{K |- path YN p}
Subgoal 2.1 is:
app YM N1 = app YM YN
Subgoal 2.2 is:
app M1 N1 = app YM YN
Subgoal 3 is:
M = N
bfree_sames < case H16.
Subgoal 2.1.2.2:
Variables: L K N1 YM YN p E
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx (L n1) (K n1)
H2 : {L n1 |- bfree (app YM N1)}@
H4 : forall p, {K n1 |- path (app YM N1) p} -> {K n1 |- path (app YM YN) p}
H5 : {L n1 |- bfree YM}*
H6 : {L n1 |- bfree N1}*
H7 : {L n1 |- bfree YM}
H8 : {L n1 |- bfree YN}
H9 : forall p, {K n1 |- path YM p} -> {K n1 |- path YM p}
H10 : {K n1 |- path N1 (p n1)}
H11 : {K n1 |- path (app YM N1) (right (p n1))}
H13 : {K n1, [path E n1] |- path (app YM YN) (right (p n1))}
H14 : member (path E n1) (K n1)
H15 : name E
============================
{K n1 |- path YN (p n1)}
Subgoal 2.1 is:
app YM N1 = app YM YN
Subgoal 2.2 is:
app M1 N1 = app YM YN
Subgoal 3 is:
M = N
bfree_sames < case H13.
Subgoal 2.1:
Variables: L K N1 YM YN
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree (app YM N1)}@
H4 : forall p, {K |- path (app YM N1) p} -> {K |- path (app YM YN) p}
H5 : {L |- bfree YM}*
H6 : {L |- bfree N1}*
H7 : {L |- bfree YM}
H8 : {L |- bfree YN}
H9 : forall p, {K |- path YM p} -> {K |- path YM p}
H10 : forall p, {K |- path N1 p} -> {K |- path YN p}
============================
app YM N1 = app YM YN
Subgoal 2.2 is:
app M1 N1 = app YM YN
Subgoal 3 is:
M = N
bfree_sames < apply IH to H1 H6 H8 H10.
Subgoal 2.1:
Variables: L K YM YN
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree (app YM YN)}@
H4 : forall p, {K |- path (app YM YN) p} -> {K |- path (app YM YN) p}
H5 : {L |- bfree YM}*
H6 : {L |- bfree YN}*
H7 : {L |- bfree YM}
H8 : {L |- bfree YN}
H9 : forall p, {K |- path YM p} -> {K |- path YM p}
H10 : forall p, {K |- path YN p} -> {K |- path YN p}
============================
app YM YN = app YM YN
Subgoal 2.2 is:
app M1 N1 = app YM YN
Subgoal 3 is:
M = N
bfree_sames < search.
Subgoal 2.2:
Variables: L K N1 M1 YM YN F
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree (app M1 N1)}@
H4 : forall p, {K |- path (app M1 N1) p} -> {K |- path (app YM YN) p}
H5 : {L |- bfree M1}*
H6 : {L |- bfree N1}*
H7 : {L, [F] |- bfree (app YM YN)}
H8 : member F L
============================
app M1 N1 = app YM YN
Subgoal 3 is:
M = N
bfree_sames < apply bfctx_member1 to H1 H8.
Subgoal 2.2:
Variables: L K N1 M1 YM YN E F1
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree (app M1 N1)}@
H4 : forall p, {K |- path (app M1 N1) p} -> {K |- path (app YM YN) p}
H5 : {L |- bfree M1}*
H6 : {L |- bfree N1}*
H7 : {L, [bfree E] |- bfree (app YM YN)}
H8 : member (bfree E) L
H9 : name E
H10 : member (path E F1) K
H11 : pname F1
============================
app M1 N1 = app YM YN
Subgoal 3 is:
M = N
bfree_sames < case H9.
Subgoal 2.2:
Variables: L K N1 M1 YM YN F1
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx (L n1) (K n1)
H2 : {L n1 |- bfree (app (M1 n1) (N1 n1))}@
H4 : forall p, {K n1 |- path (app (M1 n1) (N1 n1)) p} ->
{K n1 |- path (app (YM n1) (YN n1)) p}
H5 : {L n1 |- bfree (M1 n1)}*
H6 : {L n1 |- bfree (N1 n1)}*
H7 : {L n1, [bfree n1] |- bfree (app (YM n1) (YN n1))}
H8 : member (bfree n1) (L n1)
H10 : member (path n1 F1) (K n1)
H11 : pname F1
============================
app (M1 n1) (N1 n1) = app (YM n1) (YN n1)
Subgoal 3 is:
M = N
bfree_sames < case H7.
Subgoal 3:
Variables: L K M N F
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree M}@
H3 : {L |- bfree N}
H4 : forall p, {K |- path M p} -> {K |- path N p}
H5 : {L, [F] |- bfree M}*
H6 : member F L
============================
M = N
bfree_sames < apply bfctx_member1 to H1 H6.
Subgoal 3:
Variables: L K M N E F1
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree M}@
H3 : {L |- bfree N}
H4 : forall p, {K |- path M p} -> {K |- path N p}
H5 : {L, [bfree E] |- bfree M}*
H6 : member (bfree E) L
H7 : name E
H8 : member (path E F1) K
H9 : pname F1
============================
M = N
bfree_sames < case H5.
Subgoal 3:
Variables: L K M N F1
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree M}@
H3 : {L |- bfree N}
H4 : forall p, {K |- path M p} -> {K |- path N p}
H6 : member (bfree M) L
H7 : name M
H8 : member (path M F1) K
H9 : pname F1
============================
M = N
bfree_sames < assert {K |- path M F1}.
Subgoal 3:
Variables: L K M N F1
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree M}@
H3 : {L |- bfree N}
H4 : forall p, {K |- path M p} -> {K |- path N p}
H6 : member (bfree M) L
H7 : name M
H8 : member (path M F1) K
H9 : pname F1
H10 : {K |- path M F1}
============================
M = N
bfree_sames < apply H4 to H10.
Subgoal 3:
Variables: L K M N F1
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx L K
H2 : {L |- bfree M}@
H3 : {L |- bfree N}
H4 : forall p, {K |- path M p} -> {K |- path N p}
H6 : member (bfree M) L
H7 : name M
H8 : member (path M F1) K
H9 : pname F1
H10 : {K |- path M F1}
H11 : {K |- path N F1}
============================
M = N
bfree_sames < case H9.
Subgoal 3:
Variables: L K M N
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx (L n1) (K n1)
H2 : {L n1 |- bfree M}@
H3 : {L n1 |- bfree N}
H4 : forall p, {K n1 |- path M p} -> {K n1 |- path N p}
H6 : member (bfree M) (L n1)
H7 : name M
H8 : member (path M n1) (K n1)
H10 : {K n1 |- path M n1}
H11 : {K n1 |- path N n1}
============================
M = N
bfree_sames < case H11.
Subgoal 3.1:
Variables: L K M R N1
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx (L n1) (K n1)
H2 : {L n1 |- bfree M}@
H3 : {L n1 |- bfree (beta R N1)}
H4 : forall p, {K n1 |- path M p} -> {K n1 |- path (beta R N1) p}
H6 : member (bfree M) (L n1)
H7 : name M
H8 : member (path M n1) (K n1)
H10 : {K n1 |- path M n1}
H12 : {K n1, pi q\path N1 q => path n2 q |- path (R n2) n1}
============================
M = beta R N1
Subgoal 3.2 is:
M = N
bfree_sames < apply bfree_beta_absurd to H1 H3.
Subgoal 3.2:
Variables: L K M N F2
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx (L n1) (K n1)
H2 : {L n1 |- bfree M}@
H3 : {L n1 |- bfree N}
H4 : forall p, {K n1 |- path M p} -> {K n1 |- path N p}
H6 : member (bfree M) (L n1)
H7 : name M
H8 : member (path M n1) (K n1)
H10 : {K n1 |- path M n1}
H12 : {K n1, [F2 n1] |- path N n1}
H13 : member (F2 n1) (K n1)
============================
M = N
bfree_sames < apply bfctx_member2 to H1 H13.
Subgoal 3.2:
Variables: L K M N E1 F3
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx (L n1) (K n1)
H2 : {L n1 |- bfree M}@
H3 : {L n1 |- bfree N}
H4 : forall p, {K n1 |- path M p} -> {K n1 |- path N p}
H6 : member (bfree M) (L n1)
H7 : name M
H8 : member (path M n1) (K n1)
H10 : {K n1 |- path M n1}
H12 : {K n1, [path E1 (F3 n1)] |- path N n1}
H13 : member (path E1 (F3 n1)) (K n1)
H14 : name E1
H15 : pname (F3 n1)
============================
M = N
bfree_sames < case H12.
Subgoal 3.2:
Variables: L K M N
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx (L n1) (K n1)
H2 : {L n1 |- bfree M}@
H3 : {L n1 |- bfree N}
H4 : forall p, {K n1 |- path M p} -> {K n1 |- path N p}
H6 : member (bfree M) (L n1)
H7 : name M
H8 : member (path M n1) (K n1)
H10 : {K n1 |- path M n1}
H13 : member (path N n1) (K n1)
H14 : name N
H15 : pname n1
============================
M = N
bfree_sames < apply member_path_unique to H1 H8 H13.
Subgoal 3.2:
Variables: L K N
IH : forall L K M N, bfctx L K -> {L |- bfree M}* -> {L |- bfree N} ->
(forall p, {K |- path M p} -> {K |- path N p}) -> M =
N
H1 : bfctx (L n1) (K n1)
H2 : {L n1 |- bfree N}@
H3 : {L n1 |- bfree N}
H4 : forall p, {K n1 |- path N p} -> {K n1 |- path N p}
H6 : member (bfree N) (L n1)
H7 : name N
H8 : member (path N n1) (K n1)
H10 : {K n1 |- path N n1}
H13 : member (path N n1) (K n1)
H14 : name N
H15 : pname n1
============================
N = N
bfree_sames < search.
Proof completed.
Abella < Define brctx : olist -> olist -> prop by
brctx nil nil;
nabla x, brctx (bred x x :: L) (bfree x :: K) := brctx L K;
nabla x, brctx ((pi u\bred N u => bred x u) :: L) K := brctx L K.
Abella < Theorem brctx_mem_1 :
forall L K E, brctx L K -> member E L ->
(exists x, E = bred x x /\ name x) \/
(exists x N, E = pi u\bred N u => bred x u /\ fresh x N).
============================
forall L K E, brctx L K -> member E L ->
(exists x, E = bred x x /\ name x) \/
(exists x N, E = pi u\bred N u => bred x u /\ fresh x N)
brctx_mem_1 < induction on 1.
IH : forall L K E, brctx L K * -> member E L ->
(exists x, E = bred x x /\ name x) \/
(exists x N, E = pi u\bred N u => bred x u /\ fresh x N)
============================
forall L K E, brctx L K @ -> member E L ->
(exists x, E = bred x x /\ name x) \/
(exists x N, E = pi u\bred N u => bred x u /\ fresh x N)
brctx_mem_1 < intros.
Variables: L K E
IH : forall L K E, brctx L K * -> member E L ->
(exists x, E = bred x x /\ name x) \/
(exists x N, E = pi u\bred N u => bred x u /\ fresh x N)
H1 : brctx L K @
H2 : member E L
============================
(exists x, E = bred x x /\ name x) \/
(exists x N, E = pi u\bred N u => bred x u /\ fresh x N)
brctx_mem_1 < case H1 (keep).
Subgoal 1:
Variables: E
IH : forall L K E, brctx L K * -> member E L ->
(exists x, E = bred x x /\ name x) \/
(exists x N, E = pi u\bred N u => bred x u /\ fresh x N)
H1 : brctx nil nil @
H2 : member E nil
============================
(exists x, E = bred x x /\ name x) \/
(exists x N, E = pi u\bred N u => bred x u /\ fresh x N)
Subgoal 2 is:
(exists x, E n1 = bred x x /\ name x) \/
(exists x N, E n1 = pi u\bred N u => bred x u /\ fresh x N)
Subgoal 3 is:
(exists x, E n1 = bred x x /\ name x) \/
(exists x N, E n1 = pi u\bred N u => bred x u /\ fresh x N)
brctx_mem_1 < case H2.
Subgoal 2:
Variables: E K1 L1
IH : forall L K E, brctx L K * -> member E L ->
(exists x, E = bred x x /\ name x) \/
(exists x N, E = pi u\bred N u => bred x u /\ fresh x N)
H1 : brctx (bred n1 n1 :: L1) (bfree n1 :: K1) @
H2 : member (E n1) (bred n1 n1 :: L1)
H3 : brctx L1 K1 *
============================
(exists x, E n1 = bred x x /\ name x) \/
(exists x N, E n1 = pi u\bred N u => bred x u /\ fresh x N)
Subgoal 3 is:
(exists x, E n1 = bred x x /\ name x) \/
(exists x N, E n1 = pi u\bred N u => bred x u /\ fresh x N)
brctx_mem_1 < case H2.
Subgoal 2.1:
Variables: K1 L1
IH : forall L K E, brctx L K * -> member E L ->
(exists x, E = bred x x /\ name x) \/
(exists x N, E = pi u\bred N u => bred x u /\ fresh x N)
H1 : brctx (bred n1 n1 :: L1) (bfree n1 :: K1) @
H3 : brctx L1 K1 *
============================
(exists x, bred n1 n1 = bred x x /\ name x) \/
(exists x N, bred n1 n1 = pi u\bred N u => bred x u /\ fresh x N)
Subgoal 2.2 is:
(exists x, E n1 = bred x x /\ name x) \/
(exists x N, E n1 = pi u\bred N u => bred x u /\ fresh x N)
Subgoal 3 is:
(exists x, E n1 = bred x x /\ name x) \/
(exists x N, E n1 = pi u\bred N u => bred x u /\ fresh x N)
brctx_mem_1 < search.
Subgoal 2.2:
Variables: E K1 L1
IH : forall L K E, brctx L K * -> member E L ->
(exists x, E = bred x x /\ name x) \/
(exists x N, E = pi u\bred N u => bred x u /\ fresh x N)
H1 : brctx (bred n1 n1 :: L1) (bfree n1 :: K1) @
H3 : brctx L1 K1 *
H4 : member (E n1) L1
============================
(exists x, E n1 = bred x x /\ name x) \/
(exists x N, E n1 = pi u\bred N u => bred x u /\ fresh x N)
Subgoal 3 is:
(exists x, E n1 = bred x x /\ name x) \/
(exists x N, E n1 = pi u\bred N u => bred x u /\ fresh x N)
brctx_mem_1 < apply IH to H3 H4.
Subgoal 2.2:
Variables: E K1 L1
IH : forall L K E, brctx L K * -> member E L ->
(exists x, E = bred x x /\ name x) \/
(exists x N, E = pi u\bred N u => bred x u /\ fresh x N)
H1 : brctx (bred n1 n1 :: L1) (bfree n1 :: K1) @
H3 : brctx L1 K1 *
H4 : member (E n1) L1
H5 : (exists x, E n1 = bred x x /\ name x) \/
(exists x N, E n1 = pi u\bred N u => bred x u /\ fresh x N)
============================
(exists x, E n1 = bred x x /\ name x) \/
(exists x N, E n1 = pi u\bred N u => bred x u /\ fresh x N)
Subgoal 3 is:
(exists x, E n1 = bred x x /\ name x) \/
(exists x N, E n1 = pi u\bred N u => bred x u /\ fresh x N)
brctx_mem_1 < case H5.
Subgoal 2.2.1:
Variables: K1 L1 x
IH : forall L K E, brctx L K * -> member E L ->
(exists x, E = bred x x /\ name x) \/
(exists x N, E = pi u\bred N u => bred x u /\ fresh x N)
H1 : brctx (bred n1 n1 :: L1) (bfree n1 :: K1) @
H3 : brctx L1 K1 *
H4 : member (bred (x n1) (x n1)) L1
H6 : name (x n1)
============================
(exists x1, bred (x n1) (x n1) = bred x1 x1 /\ name x1) \/
(exists x1 N, bred (x n1) (x n1) = pi u\bred N u => bred x1 u /\
fresh x1 N)
Subgoal 2.2.2 is:
(exists x1, pi u\bred (N n1) u => bred (x n1) u = bred x1 x1 /\ name x1) \/
(exists x1 N1, pi u\bred (N n1) u => bred (x n1) u =
pi u\bred N1 u => bred x1 u /\ fresh x1 N1)
Subgoal 3 is:
(exists x, E n1 = bred x x /\ name x) \/
(exists x N, E n1 = pi u\bred N u => bred x u /\ fresh x N)
brctx_mem_1 < search.
Subgoal 2.2.2:
Variables: K1 L1 x N
IH : forall L K E, brctx L K * -> member E L ->
(exists x, E = bred x x /\ name x) \/
(exists x N, E = pi u\bred N u => bred x u /\ fresh x N)
H1 : brctx (bred n1 n1 :: L1) (bfree n1 :: K1) @
H3 : brctx L1 K1 *
H4 : member (pi u\bred (N n1) u => bred (x n1) u) L1
H6 : fresh (x n1) (N n1)
============================
(exists x1, pi u\bred (N n1) u => bred (x n1) u = bred x1 x1 /\ name x1) \/
(exists x1 N1, pi u\bred (N n1) u => bred (x n1) u =
pi u\bred N1 u => bred x1 u /\ fresh x1 N1)
Subgoal 3 is:
(exists x, E n1 = bred x x /\ name x) \/
(exists x N, E n1 = pi u\bred N u => bred x u /\ fresh x N)
brctx_mem_1 < search.
Subgoal 3:
Variables: E K1 L1 N
IH : forall L K E, brctx L K * -> member E L ->
(exists x, E = bred x x /\ name x) \/
(exists x N, E = pi u\bred N u => bred x u /\ fresh x N)
H1 : brctx ((pi u\bred N u => bred n1 u) :: L1) K1 @
H2 : member (E n1) ((pi u\bred N u => bred n1 u) :: L1)
H3 : brctx L1 K1 *
============================
(exists x, E n1 = bred x x /\ name x) \/
(exists x N, E n1 = pi u\bred N u => bred x u /\ fresh x N)
brctx_mem_1 < case H2.
Subgoal 3.1:
Variables: K1 L1 N
IH : forall L K E, brctx L K * -> member E L ->
(exists x, E = bred x x /\ name x) \/
(exists x N, E = pi u\bred N u => bred x u /\ fresh x N)
H1 : brctx ((pi u\bred N u => bred n1 u) :: L1) K1 @
H3 : brctx L1 K1 *
============================
(exists x, pi u\bred N u => bred n1 u = bred x x /\ name x) \/
(exists x N1, pi u\bred N u => bred n1 u = pi u\bred N1 u => bred x u /\
fresh x N1)
Subgoal 3.2 is:
(exists x, E n1 = bred x x /\ name x) \/
(exists x N, E n1 = pi u\bred N u => bred x u /\ fresh x N)
brctx_mem_1 < search.
Subgoal 3.2:
Variables: E K1 L1 N
IH : forall L K E, brctx L K * -> member E L ->
(exists x, E = bred x x /\ name x) \/
(exists x N, E = pi u\bred N u => bred x u /\ fresh x N)
H1 : brctx ((pi u\bred N u => bred n1 u) :: L1) K1 @
H3 : brctx L1 K1 *
H4 : member (E n1) L1
============================
(exists x, E n1 = bred x x /\ name x) \/
(exists x N, E n1 = pi u\bred N u => bred x u /\ fresh x N)
brctx_mem_1 < apply IH to H3 H4.
Subgoal 3.2:
Variables: E K1 L1 N
IH : forall L K E, brctx L K * -> member E L ->
(exists x, E = bred x x /\ name x) \/
(exists x N, E = pi u\bred N u => bred x u /\ fresh x N)
H1 : brctx ((pi u\bred N u => bred n1 u) :: L1) K1 @
H3 : brctx L1 K1 *
H4 : member (E n1) L1
H5 : (exists x, E n1 = bred x x /\ name x) \/
(exists x N, E n1 = pi u\bred N u => bred x u /\ fresh x N)
============================
(exists x, E n1 = bred x x /\ name x) \/
(exists x N, E n1 = pi u\bred N u => bred x u /\ fresh x N)
brctx_mem_1 < case H5.
Subgoal 3.2.1:
Variables: K1 L1 N x
IH : forall L K E, brctx L K * -> member E L ->
(exists x, E = bred x x /\ name x) \/
(exists x N, E = pi u\bred N u => bred x u /\ fresh x N)
H1 : brctx ((pi u\bred N u => bred n1 u) :: L1) K1 @
H3 : brctx L1 K1 *
H4 : member (bred (x n1) (x n1)) L1
H6 : name (x n1)
============================
(exists x1, bred (x n1) (x n1) = bred x1 x1 /\ name x1) \/
(exists x1 N, bred (x n1) (x n1) = pi u\bred N u => bred x1 u /\
fresh x1 N)
Subgoal 3.2.2 is:
(exists x1, pi u\bred (N1 n1) u => bred (x n1) u = bred x1 x1 /\ name x1) \/
(exists x1 N, pi u\bred (N1 n1) u => bred (x n1) u =
pi u\bred N u => bred x1 u /\ fresh x1 N)
brctx_mem_1 < search.
Subgoal 3.2.2:
Variables: K1 L1 N x N1
IH : forall L K E, brctx L K * -> member E L ->
(exists x, E = bred x x /\ name x) \/
(exists x N, E = pi u\bred N u => bred x u /\ fresh x N)
H1 : brctx ((pi u\bred N u => bred n1 u) :: L1) K1 @
H3 : brctx L1 K1 *
H4 : member (pi u\bred (N1 n1) u => bred (x n1) u) L1
H6 : fresh (x n1) (N1 n1)
============================
(exists x1, pi u\bred (N1 n1) u => bred (x n1) u = bred x1 x1 /\ name x1) \/
(exists x1 N, pi u\bred (N1 n1) u => bred (x n1) u =
pi u\bred N u => bred x1 u /\ fresh x1 N)
brctx_mem_1 < search.
Proof completed.
Abella < Theorem brctx_sync :
forall L K, nabla x, brctx (L x) (K x) -> member (bred x x) (L x) ->
member (bfree x) (K x).
============================
forall L K, nabla x, brctx (L x) (K x) -> member (bred x x) (L x) ->
member (bfree x) (K x)
brctx_sync < induction on 1.
IH : forall L K, nabla x, brctx (L x) (K x) * -> member (bred x x) (L x) ->
member (bfree x) (K x)
============================
forall L K, nabla x, brctx (L x) (K x) @ -> member (bred x x) (L x) ->
member (bfree x) (K x)
brctx_sync < intros.
Variables: L K
IH : forall L K, nabla x, brctx (L x) (K x) * -> member (bred x x) (L x) ->
member (bfree x) (K x)
H1 : brctx (L n1) (K n1) @
H2 : member (bred n1 n1) (L n1)
============================
member (bfree n1) (K n1)
brctx_sync < case H1.
Subgoal 1:
IH : forall L K, nabla x, brctx (L x) (K x) * -> member (bred x x) (L x) ->
member (bfree x) (K x)
H2 : member (bred n1 n1) nil
============================
member (bfree n1) nil
Subgoal 2 is:
member (bfree n1) (bfree n2 :: K1 n1)
Subgoal 3 is:
member (bfree n1) (bfree n1 :: K1)
Subgoal 4 is:
member (bfree n1) (K2 n1)
Subgoal 5 is:
member (bfree n1) K1
brctx_sync < case H2.
Subgoal 2:
Variables: K1 L1
IH : forall L K, nabla x, brctx (L x) (K x) * -> member (bred x x) (L x) ->
member (bfree x) (K x)
H2 : member (bred n1 n1) (bred n2 n2 :: L1 n1)
H3 : brctx (L1 n1) (K1 n1) *
============================
member (bfree n1) (bfree n2 :: K1 n1)
Subgoal 3 is:
member (bfree n1) (bfree n1 :: K1)
Subgoal 4 is:
member (bfree n1) (K2 n1)
Subgoal 5 is:
member (bfree n1) K1
brctx_sync < case H2.
Subgoal 2:
Variables: K1 L1
IH : forall L K, nabla x, brctx (L x) (K x) * -> member (bred x x) (L x) ->
member (bfree x) (K x)
H3 : brctx (L1 n1) (K1 n1) *
H4 : member (bred n1 n1) (L1 n1)
============================
member (bfree n1) (bfree n2 :: K1 n1)
Subgoal 3 is:
member (bfree n1) (bfree n1 :: K1)
Subgoal 4 is:
member (bfree n1) (K2 n1)
Subgoal 5 is:
member (bfree n1) K1
brctx_sync < apply IH to H3 H4.
Subgoal 2:
Variables: K1 L1
IH : forall L K, nabla x, brctx (L x) (K x) * -> member (bred x x) (L x) ->
member (bfree x) (K x)
H3 : brctx (L1 n1) (K1 n1) *
H4 : member (bred n1 n1) (L1 n1)
H5 : member (bfree n1) (K1 n1)
============================
member (bfree n1) (bfree n2 :: K1 n1)
Subgoal 3 is:
member (bfree n1) (bfree n1 :: K1)
Subgoal 4 is:
member (bfree n1) (K2 n1)
Subgoal 5 is:
member (bfree n1) K1
brctx_sync < search.
Subgoal 3:
Variables: K1 L1
IH : forall L K, nabla x, brctx (L x) (K x) * -> member (bred x x) (L x) ->
member (bfree x) (K x)
H2 : member (bred n1 n1) (bred n1 n1 :: L1)
H3 : brctx L1 K1 *
============================
member (bfree n1) (bfree n1 :: K1)
Subgoal 4 is:
member (bfree n1) (K2 n1)
Subgoal 5 is:
member (bfree n1) K1
brctx_sync < case H2.
Subgoal 3.1:
Variables: K1 L1
IH : forall L K, nabla x, brctx (L x) (K x) * -> member (bred x x) (L x) ->
member (bfree x) (K x)
H3 : brctx L1 K1 *
============================
member (bfree n1) (bfree n1 :: K1)
Subgoal 3.2 is:
member (bfree n1) (bfree n1 :: K1)
Subgoal 4 is:
member (bfree n1) (K2 n1)
Subgoal 5 is:
member (bfree n1) K1
brctx_sync < search.
Subgoal 3.2:
Variables: K1 L1
IH : forall L K, nabla x, brctx (L x) (K x) * -> member (bred x x) (L x) ->
member (bfree x) (K x)
H3 : brctx L1 K1 *
H4 : member (bred n1 n1) L1
============================
member (bfree n1) (bfree n1 :: K1)
Subgoal 4 is:
member (bfree n1) (K2 n1)
Subgoal 5 is:
member (bfree n1) K1
brctx_sync < apply IH to H3 H4.
Subgoal 3.2:
Variables: K1 L1
IH : forall L K, nabla x, brctx (L x) (K x) * -> member (bred x x) (L x) ->
member (bfree x) (K x)
H3 : brctx L1 K1 *
H4 : member (bred n1 n1) L1
H5 : member (bfree n1) K1
============================
member (bfree n1) (bfree n1 :: K1)
Subgoal 4 is:
member (bfree n1) (K2 n1)
Subgoal 5 is:
member (bfree n1) K1
brctx_sync < search.
Subgoal 4:
Variables: K2 L1 N
IH : forall L K, nabla x, brctx (L x) (K x) * -> member (bred x x) (L x) ->
member (bfree x) (K x)
H2 : member (bred n1 n1) ((pi u\bred (N n1) u => bred n2 u) :: L1 n1)
H3 : brctx (L1 n1) (K2 n1) *
============================
member (bfree n1) (K2 n1)
Subgoal 5 is:
member (bfree n1) K1
brctx_sync < case H2.
Subgoal 4:
Variables: K2 L1 N
IH : forall L K, nabla x, brctx (L x) (K x) * -> member (bred x x) (L x) ->
member (bfree x) (K x)
H3 : brctx (L1 n1) (K2 n1) *
H4 : member (bred n1 n1) (L1 n1)
============================
member (bfree n1) (K2 n1)
Subgoal 5 is:
member (bfree n1) K1
brctx_sync < apply IH to H3 H4.
Subgoal 4:
Variables: K2 L1 N
IH : forall L K, nabla x, brctx (L x) (K x) * -> member (bred x x) (L x) ->
member (bfree x) (K x)
H3 : brctx (L1 n1) (K2 n1) *
H4 : member (bred n1 n1) (L1 n1)
H5 : member (bfree n1) (K2 n1)
============================
member (bfree n1) (K2 n1)
Subgoal 5 is:
member (bfree n1) K1
brctx_sync < search.
Subgoal 5:
Variables: K1 L1 N
IH : forall L K, nabla x, brctx (L x) (K x) * -> member (bred x x) (L x) ->
member (bfree x) (K x)
H2 : member (bred n1 n1) ((pi u\bred N u => bred n1 u) :: L1)
H3 : brctx L1 K1 *
============================
member (bfree n1) K1
brctx_sync < case H2.
Subgoal 5:
Variables: K1 L1 N
IH : forall L K, nabla x, brctx (L x) (K x) * -> member (bred x x) (L x) ->
member (bfree x) (K x)
H3 : brctx L1 K1 *
H4 : member (bred n1 n1) L1
============================
member (bfree n1) K1
brctx_sync < apply IH to H3 H4.
Subgoal 5:
Variables: K1 L1 N
IH : forall L K, nabla x, brctx (L x) (K x) * -> member (bred x x) (L x) ->
member (bfree x) (K x)
H3 : brctx L1 K1 *
H4 : member (bred n1 n1) L1
H5 : member (bfree n1) K1
============================
member (bfree n1) K1
brctx_sync < search.
Proof completed.
Abella < Theorem bred_makes_bfree :
forall L K M U, brctx L K -> {L |- bred M U} -> {K |- bfree U}.
============================
forall L K M U, brctx L K -> {L |- bred M U} -> {K |- bfree U}
bred_makes_bfree < induction on 2.
IH : forall L K M U, brctx L K -> {L |- bred M U}* -> {K |- bfree U}
============================
forall L K M U, brctx L K -> {L |- bred M U}@ -> {K |- bfree U}
bred_makes_bfree < intros.
Variables: L K M U
IH : forall L K M U, brctx L K -> {L |- bred M U}* -> {K |- bfree U}
H1 : brctx L K
H2 : {L |- bred M U}@
============================
{K |- bfree U}
bred_makes_bfree < case H2 (keep).
Subgoal 1:
Variables: L K U1 M1
IH : forall L K M U, brctx L K -> {L |- bred M U}* -> {K |- bfree U}
H1 : brctx L K
H2 : {L |- bred (abs M1) (abs U1)}@
H3 : {L, bred n1 n1 |- bred (M1 n1) (U1 n1)}*
============================
{K |- bfree (abs U1)}
Subgoal 2 is:
{K |- bfree (app U1 V)}
Subgoal 3 is:
{K |- bfree U}
Subgoal 4 is:
{K |- bfree U}
bred_makes_bfree < apply IH to _ H3.
Subgoal 1:
Variables: L K U1 M1
IH : forall L K M U, brctx L K -> {L |- bred M U}* -> {K |- bfree U}
H1 : brctx L K
H2 : {L |- bred (abs M1) (abs U1)}@
H3 : {L, bred n1 n1 |- bred (M1 n1) (U1 n1)}*
H4 : {K, bfree n1 |- bfree (U1 n1)}
============================
{K |- bfree (abs U1)}
Subgoal 2 is:
{K |- bfree (app U1 V)}
Subgoal 3 is:
{K |- bfree U}
Subgoal 4 is:
{K |- bfree U}
bred_makes_bfree < search.
Subgoal 2:
Variables: L K V N U1 M1
IH : forall L K M U, brctx L K -> {L |- bred M U}* -> {K |- bfree U}
H1 : brctx L K
H2 : {L |- bred (app M1 N) (app U1 V)}@
H3 : {L |- bred M1 U1}*
H4 : {L |- bred N V}*
============================
{K |- bfree (app U1 V)}
Subgoal 3 is:
{K |- bfree U}
Subgoal 4 is:
{K |- bfree U}
bred_makes_bfree < apply IH to _ H3.
Subgoal 2:
Variables: L K V N U1 M1
IH : forall L K M U, brctx L K -> {L |- bred M U}* -> {K |- bfree U}
H1 : brctx L K
H2 : {L |- bred (app M1 N) (app U1 V)}@
H3 : {L |- bred M1 U1}*
H4 : {L |- bred N V}*
H5 : {K |- bfree U1}
============================
{K |- bfree (app U1 V)}
Subgoal 3 is:
{K |- bfree U}
Subgoal 4 is:
{K |- bfree U}
bred_makes_bfree < apply IH to _ H4.
Subgoal 2:
Variables: L K V N U1 M1
IH : forall L K M U, brctx L K -> {L |- bred M U}* -> {K |- bfree U}
H1 : brctx L K
H2 : {L |- bred (app M1 N) (app U1 V)}@
H3 : {L |- bred M1 U1}*
H4 : {L |- bred N V}*
H5 : {K |- bfree U1}
H6 : {K |- bfree V}
============================
{K |- bfree (app U1 V)}
Subgoal 3 is:
{K |- bfree U}
Subgoal 4 is:
{K |- bfree U}
bred_makes_bfree < search.
Subgoal 3:
Variables: L K U R N
IH : forall L K M U, brctx L K -> {L |- bred M U}* -> {K |- bfree U}
H1 : brctx L K
H2 : {L |- bred (beta R N) U}@
H3 : {L, pi u\bred N u => bred n1 u |- bred (R n1) U}*
============================
{K |- bfree U}
Subgoal 4 is:
{K |- bfree U}
bred_makes_bfree < apply IH to _ H3.
Subgoal 3:
Variables: L K U R N
IH : forall L K M U, brctx L K -> {L |- bred M U}* -> {K |- bfree U}
H1 : brctx L K
H2 : {L |- bred (beta R N) U}@
H3 : {L, pi u\bred N u => bred n1 u |- bred (R n1) U}*
H4 : {K |- bfree U}
============================
{K |- bfree U}
Subgoal 4 is:
{K |- bfree U}
bred_makes_bfree < search.
Subgoal 4:
Variables: L K M U F
IH : forall L K M U, brctx L K -> {L |- bred M U}* -> {K |- bfree U}
H1 : brctx L K
H2 : {L |- bred M U}@
H3 : {L, [F] |- bred M U}*
H4 : member F L
============================
{K |- bfree U}
bred_makes_bfree < apply brctx_mem_1 to H1 H4.
Subgoal 4:
Variables: L K M U F
IH : forall L K M U, brctx L K -> {L |- bred M U}* -> {K |- bfree U}
H1 : brctx L K
H2 : {L |- bred M U}@
H3 : {L, [F] |- bred M U}*
H4 : member F L
H5 : (exists x, F = bred x x /\ name x) \/
(exists x N, F = pi u\bred N u => bred x u /\ fresh x N)
============================
{K |- bfree U}
bred_makes_bfree < case H5.
Subgoal 4.1:
Variables: L K M U x
IH : forall L K M U, brctx L K -> {L |- bred M U}* -> {K |- bfree U}
H1 : brctx L K
H2 : {L |- bred M U}@
H3 : {L, [bred x x] |- bred M U}*
H4 : member (bred x x) L
H6 : name x
============================
{K |- bfree U}
Subgoal 4.2 is:
{K |- bfree U}
bred_makes_bfree < case H3.
Subgoal 4.1:
Variables: L K U
IH : forall L K M U, brctx L K -> {L |- bred M U}* -> {K |- bfree U}
H1 : brctx L K
H2 : {L |- bred U U}@
H4 : member (bred U U) L
H6 : name U
============================
{K |- bfree U}
Subgoal 4.2 is:
{K |- bfree U}
bred_makes_bfree < case H6.
Subgoal 4.1:
Variables: L K
IH : forall L K M U, brctx L K -> {L |- bred M U}* -> {K |- bfree U}
H1 : brctx (L n1) (K n1)
H2 : {L n1 |- bred n1 n1}@
H4 : member (bred n1 n1) (L n1)
============================
{K n1 |- bfree n1}
Subgoal 4.2 is:
{K |- bfree U}
bred_makes_bfree < apply brctx_sync to H1 H4.
Subgoal 4.1:
Variables: L K
IH : forall L K M U, brctx L K -> {L |- bred M U}* -> {K |- bfree U}
H1 : brctx (L n1) (K n1)
H2 : {L n1 |- bred n1 n1}@
H4 : member (bred n1 n1) (L n1)
H7 : member (bfree n1) (K n1)
============================
{K n1 |- bfree n1}
Subgoal 4.2 is:
{K |- bfree U}
bred_makes_bfree < search.
Subgoal 4.2:
Variables: L K M U x N
IH : forall L K M U, brctx L K -> {L |- bred M U}* -> {K |- bfree U}
H1 : brctx L K
H2 : {L |- bred M U}@
H3 : {L, [pi u\bred N u => bred x u] |- bred M U}*
H4 : member (pi u\bred N u => bred x u) L
H6 : fresh x N
============================
{K |- bfree U}
bred_makes_bfree < case H3.
Subgoal 4.2:
Variables: L K M U N
IH : forall L K M U, brctx L K -> {L |- bred M U}* -> {K |- bfree U}
H1 : brctx L K
H2 : {L |- bred M U}@
H4 : member (pi u\bred N u => bred M u) L
H6 : fresh M N
H7 : {L |- bred N U}*
============================
{K |- bfree U}
bred_makes_bfree < case H6.
Subgoal 4.2:
Variables: L K U X
IH : forall L K M U, brctx L K -> {L |- bred M U}* -> {K |- bfree U}
H1 : brctx (L n1) (K n1)
H2 : {L n1 |- bred n1 (U n1)}@
H4 : member (pi u\bred X u => bred n1 u) (L n1)
H7 : {L n1 |- bred X (U n1)}*
============================
{K n1 |- bfree (U n1)}
bred_makes_bfree < apply IH to H1 H7.
Subgoal 4.2:
Variables: L K U X
IH : forall L K M U, brctx L K -> {L |- bred M U}* -> {K |- bfree U}
H1 : brctx (L n1) (K n1)
H2 : {L n1 |- bred n1 (U n1)}@
H4 : member (pi u\bred X u => bred n1 u) (L n1)
H7 : {L n1 |- bred X (U n1)}*
H8 : {K n1 |- bfree (U n1)}
============================
{K n1 |- bfree (U n1)}
bred_makes_bfree < search.
Proof completed.
Abella < Theorem same_paths_bred_same :
forall M N U V, (forall P, {path M P} -> {path N P}) -> {bred M U} ->
{bred N V} -> U =
V.
============================
forall M N U V, (forall P, {path M P} -> {path N P}) -> {bred M U} ->
{bred N V} -> U =
V
same_paths_bred_same < intros.
Variables: M N U V
H1 : forall P, {path M P} -> {path N P}
H2 : {bred M U}
H3 : {bred N V}
============================
U = V
same_paths_bred_same < apply bred_makes_bfree to _ H2.
Variables: M N U V
H1 : forall P, {path M P} -> {path N P}
H2 : {bred M U}
H3 : {bred N V}
H4 : {bfree U}
============================
U = V
same_paths_bred_same < apply bred_makes_bfree to _ H3.
Variables: M N U V
H1 : forall P, {path M P} -> {path N P}
H2 : {bred M U}
H3 : {bred N V}
H4 : {bfree U}
H5 : {bfree V}
============================
U = V
same_paths_bred_same < backchain bfree_sames.
Variables: M N U V
H1 : forall P, {path M P} -> {path N P}
H2 : {bred M U}
H3 : {bred N V}
H4 : {bfree U}
H5 : {bfree V}
============================
forall p, {path U p} -> {path V p}
same_paths_bred_same < intros.
Variables: M N U V p
H1 : forall P, {path M P} -> {path N P}
H2 : {bred M U}
H3 : {bred N V}
H4 : {bfree U}
H5 : {bfree V}
H6 : {path U p}
============================
{path V p}
same_paths_bred_same < apply bred_rtl to _ H2 H6.
Variables: M N U V p
H1 : forall P, {path M P} -> {path N P}
H2 : {bred M U}
H3 : {bred N V}
H4 : {bfree U}
H5 : {bfree V}
H6 : {path U p}
H7 : {path M p}
============================
{path V p}
same_paths_bred_same < apply H1 to H7.
Variables: M N U V p
H1 : forall P, {path M P} -> {path N P}
H2 : {bred M U}
H3 : {bred N V}
H4 : {bfree U}
H5 : {bfree V}
H6 : {path U p}
H7 : {path M p}
H8 : {path N p}
============================
{path V p}
same_paths_bred_same < apply bred_ltr to _ H3 H8.
Variables: M N U V p
H1 : forall P, {path M P} -> {path N P}
H2 : {bred M U}
H3 : {bred N V}
H4 : {bfree U}
H5 : {bfree V}
H6 : {path U p}
H7 : {path M p}
H8 : {path N p}
H9 : {path V p}
============================
{path V p}
same_paths_bred_same < search.
Proof completed.
Abella <