Welcome to Abella 2.0.5-dev
Abella < Define app : (list A) -> (list A) -> (list A) -> prop by
app nil L L;
app (X :: L1) L2 (X :: L3) := app L1 L2 L3.
Abella < Theorem app_det [A] :
forall L1 L2 L3 L3', app L1 L2 L3 -> app L1 L2 L3' -> L3 = L3'.
============================
forall L1 L2 L3 L3', app L1 L2 L3 -> app L1 L2 L3' -> L3 = L3'
app_det < induction on 1.
IH : forall L1 L2 L3 L3', app L1 L2 L3 * -> app L1 L2 L3' -> L3 = L3'
============================
forall L1 L2 L3 L3', app L1 L2 L3 @ -> app L1 L2 L3' -> L3 = L3'
app_det < intros.
Variables: L1 L2 L3 L3'
IH : forall L1 L2 L3 L3', app L1 L2 L3 * -> app L1 L2 L3' -> L3 = L3'
H1 : app L1 L2 L3 @
H2 : app L1 L2 L3'
============================
L3 = L3'
app_det < case H1.
Subgoal 1:
Variables: L3 L3'
IH : forall L1 L2 L3 L3', app L1 L2 L3 * -> app L1 L2 L3' -> L3 = L3'
H2 : app nil L3 L3'
============================
L3 = L3'
Subgoal 2 is:
X :: L6 = L3'
app_det < case H2.
Subgoal 1:
Variables: L3'
IH : forall L1 L2 L3 L3', app L1 L2 L3 * -> app L1 L2 L3' -> L3 = L3'
============================
L3' = L3'
Subgoal 2 is:
X :: L6 = L3'
app_det < search.
Subgoal 2:
Variables: L2 L3' L6 X L4
IH : forall L1 L2 L3 L3', app L1 L2 L3 * -> app L1 L2 L3' -> L3 = L3'
H2 : app (X :: L4) L2 L3'
H3 : app L4 L2 L6 *
============================
X :: L6 = L3'
app_det < case H2.
Subgoal 2:
Variables: L2 L6 X L4 L8
IH : forall L1 L2 L3 L3', app L1 L2 L3 * -> app L1 L2 L3' -> L3 = L3'
H3 : app L4 L2 L6 *
H4 : app L4 L2 L8
============================
X :: L6 = X :: L8
app_det < apply IH to H3 H4.
Subgoal 2:
Variables: L2 X L4 L8
IH : forall L1 L2 L3 L3', app L1 L2 L3 * -> app L1 L2 L3' -> L3 = L3'
H3 : app L4 L2 L8 *
H4 : app L4 L2 L8
============================
X :: L8 = X :: L8
app_det < search.
Proof completed.
Abella < Kind nat Type.
Abella < Theorem app_det_nat :
forall L1 L2 L3 L3', app L1 L2 L3 -> app L1 L2 L3' -> L3 = L3'.
============================
forall L1 L2 L3 L3', app L1 L2 L3 -> app L1 L2 L3' -> L3 = L3'
app_det_nat < intros.
Variables: L1 L2 L3 L3'
H1 : app L1 L2 L3
H2 : app L1 L2 L3'
============================
L3 = L3'
app_det_nat < apply app_det to H1 H2.
Variables: L1 L2 L3'
H1 : app L1 L2 L3'
H2 : app L1 L2 L3'
============================
L3' = L3'
app_det_nat < search.
Proof completed.
Abella < Theorem app_det_list [B] :
forall L1 L2 L3 L3', app L1 L2 L3 -> app L1 L2 L3' -> L3 = L3'.
============================
forall L1 L2 L3 L3', app L1 L2 L3 -> app L1 L2 L3' -> L3 = L3'
app_det_list < intros.
Variables: L1 L2 L3 L3'
H1 : app L1 L2 L3
H2 : app L1 L2 L3'
============================
L3 = L3'
app_det_list < apply app_det to H1 H2.
Variables: L1 L2 L3'
H1 : app L1 L2 L3'
H2 : app L1 L2 L3'
============================
L3' = L3'
app_det_list < search.
Proof completed.
Abella <