Welcome to Abella 2.0.7-dev.
Abella < Type is_o o -> prop.

Abella < Import "list" with is_o := is_o.
Importing from "list".

Abella < Define adj : (list o) -> o -> (list o) -> prop by 
adj L A (A :: L) := is_o A /\ is_list L;
adj (B :: K) A (B :: L) := is_o B /\ adj K A L.

Abella < Theorem adj_1_is_list : 
forall K A L, adj K A L -> is_list K.


============================
 forall K A L, adj K A L -> is_list K

adj_1_is_list < induction on 1.

IH : forall K A L, adj K A L * -> is_list K
============================
 forall K A L, adj K A L @ -> is_list K

adj_1_is_list < intros.

Variables: K A L
IH : forall K A L, adj K A L * -> is_list K
H1 : adj K A L @
============================
 is_list K

adj_1_is_list < case H1.
Subgoal 1:

Variables: K A
IH : forall K A L, adj K A L * -> is_list K
H2 : is_o A
H3 : is_list K
============================
 is_list K

Subgoal 2 is:
 is_list (B :: K1)

adj_1_is_list < search.
Subgoal 2:

Variables: A L1 B K1
IH : forall K A L, adj K A L * -> is_list K
H2 : is_o B
H3 : adj K1 A L1 *
============================
 is_list (B :: K1)

adj_1_is_list < apply IH to H3.
Subgoal 2:

Variables: A L1 B K1
IH : forall K A L, adj K A L * -> is_list K
H2 : is_o B
H3 : adj K1 A L1 *
H4 : is_list K1
============================
 is_list (B :: K1)

adj_1_is_list < search.
Proof completed.
Abella < Theorem adj_2_is_o : 
forall K A L, adj K A L -> is_o A.


============================
 forall K A L, adj K A L -> is_o A

adj_2_is_o < induction on 1.

IH : forall K A L, adj K A L * -> is_o A
============================
 forall K A L, adj K A L @ -> is_o A

adj_2_is_o < intros.

Variables: K A L
IH : forall K A L, adj K A L * -> is_o A
H1 : adj K A L @
============================
 is_o A

adj_2_is_o < case H1.
Subgoal 1:

Variables: K A
IH : forall K A L, adj K A L * -> is_o A
H2 : is_o A
H3 : is_list K
============================
 is_o A

Subgoal 2 is:
 is_o A

adj_2_is_o < search.
Subgoal 2:

Variables: A L1 B K1
IH : forall K A L, adj K A L * -> is_o A
H2 : is_o B
H3 : adj K1 A L1 *
============================
 is_o A

adj_2_is_o < apply IH to H3.
Subgoal 2:

Variables: A L1 B K1
IH : forall K A L, adj K A L * -> is_o A
H2 : is_o B
H3 : adj K1 A L1 *
H4 : is_o A
============================
 is_o A

adj_2_is_o < search.
Proof completed.
Abella < Theorem adj_3_is_list : 
forall K A L, adj K A L -> is_list L.


============================
 forall K A L, adj K A L -> is_list L

adj_3_is_list < induction on 1.

IH : forall K A L, adj K A L * -> is_list L
============================
 forall K A L, adj K A L @ -> is_list L

adj_3_is_list < intros.

Variables: K A L
IH : forall K A L, adj K A L * -> is_list L
H1 : adj K A L @
============================
 is_list L

adj_3_is_list < case H1.
Subgoal 1:

Variables: K A
IH : forall K A L, adj K A L * -> is_list L
H2 : is_o A
H3 : is_list K
============================
 is_list (A :: K)

Subgoal 2 is:
 is_list (B :: L1)

adj_3_is_list < search.
Subgoal 2:

Variables: A L1 B K1
IH : forall K A L, adj K A L * -> is_list L
H2 : is_o B
H3 : adj K1 A L1 *
============================
 is_list (B :: L1)

adj_3_is_list < apply IH to H3.
Subgoal 2:

Variables: A L1 B K1
IH : forall K A L, adj K A L * -> is_list L
H2 : is_o B
H3 : adj K1 A L1 *
H4 : is_list L1
============================
 is_list (B :: L1)

adj_3_is_list < search.
Proof completed.
Abella < Theorem adj_exists : 
forall A L, is_o A -> is_list L -> (exists M, adj L A M).


============================
 forall A L, is_o A -> is_list L -> (exists M, adj L A M)

adj_exists < intros.

Variables: A L
H1 : is_o A
H2 : is_list L
============================
 exists M, adj L A M

adj_exists < search.
Proof completed.
Abella < Theorem adj_swap : 
forall A J K B L, adj J A K -> adj K B L ->
  (exists U, adj J B U /\ adj U A L).


============================
 forall A J K B L, adj J A K -> adj K B L ->
   (exists U, adj J B U /\ adj U A L)

adj_swap < induction on 2.

IH : forall A J K B L, adj J A K -> adj K B L * ->
       (exists U, adj J B U /\ adj U A L)
============================
 forall A J K B L, adj J A K -> adj K B L @ ->
   (exists U, adj J B U /\ adj U A L)

adj_swap < intros.

Variables: A J K B L
IH : forall A J K B L, adj J A K -> adj K B L * ->
       (exists U, adj J B U /\ adj U A L)
H1 : adj J A K
H2 : adj K B L @
============================
 exists U, adj J B U /\ adj U A L

adj_swap < case H2.
Subgoal 1:

Variables: A J K B
IH : forall A J K B L, adj J A K -> adj K B L * ->
       (exists U, adj J B U /\ adj U A L)
H1 : adj J A K
H3 : is_o B
H4 : is_list K
============================
 exists U, adj J B U /\ adj U A (B :: K)

Subgoal 2 is:
 exists U, adj J B U /\ adj U A (B1 :: L1)

adj_swap < case H1.
Subgoal 1.1:

Variables: A J B
IH : forall A J K B L, adj J A K -> adj K B L * ->
       (exists U, adj J B U /\ adj U A L)
H3 : is_o B
H4 : is_list (A :: J)
H5 : is_o A
H6 : is_list J
============================
 exists U, adj J B U /\ adj U A (B :: A :: J)

Subgoal 1.2 is:
 exists U, adj (B1 :: K1) B U /\ adj U A (B :: B1 :: L1)

Subgoal 2 is:
 exists U, adj J B U /\ adj U A (B1 :: L1)

adj_swap < search.
Subgoal 1.2:

Variables: A B L1 B1 K1
IH : forall A J K B L, adj J A K -> adj K B L * ->
       (exists U, adj J B U /\ adj U A L)
H3 : is_o B
H4 : is_list (B1 :: L1)
H5 : is_o B1
H6 : adj K1 A L1
============================
 exists U, adj (B1 :: K1) B U /\ adj U A (B :: B1 :: L1)

Subgoal 2 is:
 exists U, adj J B U /\ adj U A (B1 :: L1)

adj_swap < apply adj_1_is_list to H6.
Subgoal 1.2:

Variables: A B L1 B1 K1
IH : forall A J K B L, adj J A K -> adj K B L * ->
       (exists U, adj J B U /\ adj U A L)
H3 : is_o B
H4 : is_list (B1 :: L1)
H5 : is_o B1
H6 : adj K1 A L1
H7 : is_list K1
============================
 exists U, adj (B1 :: K1) B U /\ adj U A (B :: B1 :: L1)

Subgoal 2 is:
 exists U, adj J B U /\ adj U A (B1 :: L1)

adj_swap < search.
Subgoal 2:

Variables: A J B L1 B1 K1
IH : forall A J K B L, adj J A K -> adj K B L * ->
       (exists U, adj J B U /\ adj U A L)
H1 : adj J A (B1 :: K1)
H3 : is_o B1
H4 : adj K1 B L1 *
============================
 exists U, adj J B U /\ adj U A (B1 :: L1)

adj_swap < case H1.
Subgoal 2.1:

Variables: B L1 B1 K1
IH : forall A J K B L, adj J A K -> adj K B L * ->
       (exists U, adj J B U /\ adj U A L)
H3 : is_o B1
H4 : adj K1 B L1 *
H5 : is_o B1
H6 : is_list K1
============================
 exists U, adj K1 B U /\ adj U B1 (B1 :: L1)

Subgoal 2.2 is:
 exists U, adj (B1 :: K2) B U /\ adj U A (B1 :: L1)

adj_swap < apply adj_3_is_list to H4.
Subgoal 2.1:

Variables: B L1 B1 K1
IH : forall A J K B L, adj J A K -> adj K B L * ->
       (exists U, adj J B U /\ adj U A L)
H3 : is_o B1
H4 : adj K1 B L1 *
H5 : is_o B1
H6 : is_list K1
H7 : is_list L1
============================
 exists U, adj K1 B U /\ adj U B1 (B1 :: L1)

Subgoal 2.2 is:
 exists U, adj (B1 :: K2) B U /\ adj U A (B1 :: L1)

adj_swap < search.
Subgoal 2.2:

Variables: A B L1 B1 K1 K2
IH : forall A J K B L, adj J A K -> adj K B L * ->
       (exists U, adj J B U /\ adj U A L)
H3 : is_o B1
H4 : adj K1 B L1 *
H5 : is_o B1
H6 : adj K2 A K1
============================
 exists U, adj (B1 :: K2) B U /\ adj U A (B1 :: L1)

adj_swap < apply IH to H6 H4.
Subgoal 2.2:

Variables: A B L1 B1 K1 K2 U
IH : forall A J K B L, adj J A K -> adj K B L * ->
       (exists U, adj J B U /\ adj U A L)
H3 : is_o B1
H4 : adj K1 B L1 *
H5 : is_o B1
H6 : adj K2 A K1
H7 : adj K2 B U
H8 : adj U A L1
============================
 exists U, adj (B1 :: K2) B U /\ adj U A (B1 :: L1)

adj_swap < search.
Proof completed.
Abella < Theorem adj_same : 
forall A L B, adj L A (B :: L) -> A = B.


============================
 forall A L B, adj L A (B :: L) -> A = B

adj_same < induction on 1.

IH : forall A L B, adj L A (B :: L) * -> A = B
============================
 forall A L B, adj L A (B :: L) @ -> A = B

adj_same < intros.

Variables: A L B
IH : forall A L B, adj L A (B :: L) * -> A = B
H1 : adj L A (B :: L) @
============================
 A = B

adj_same < case H1.
Subgoal 1:

Variables: L B
IH : forall A L B, adj L A (B :: L) * -> A = B
H2 : is_o B
H3 : is_list L
============================
 B = B

Subgoal 2 is:
 A = B

adj_same < search.
Subgoal 2:

Variables: A B K
IH : forall A L B, adj L A (B :: L) * -> A = B
H2 : is_o B
H3 : adj K A (B :: K) *
============================
 A = B

adj_same < apply IH to H3.
Subgoal 2:

Variables: B K
IH : forall A L B, adj L A (B :: L) * -> A = B
H2 : is_o B
H3 : adj K B (B :: K) *
============================
 B = B

adj_same < search.
Proof completed.
Abella < Theorem adj_append_1 : 
forall J A K L KL, adj J A K -> append K L KL ->
  (exists JL, append J L JL /\ adj JL A KL).


============================
 forall J A K L KL, adj J A K -> append K L KL ->
   (exists JL, append J L JL /\ adj JL A KL)

adj_append_1 < induction on 1.

IH : forall J A K L KL, adj J A K * -> append K L KL ->
       (exists JL, append J L JL /\ adj JL A KL)
============================
 forall J A K L KL, adj J A K @ -> append K L KL ->
   (exists JL, append J L JL /\ adj JL A KL)

adj_append_1 < intros.

Variables: J A K L KL
IH : forall J A K L KL, adj J A K * -> append K L KL ->
       (exists JL, append J L JL /\ adj JL A KL)
H1 : adj J A K @
H2 : append K L KL
============================
 exists JL, append J L JL /\ adj JL A KL

adj_append_1 < case H1.
Subgoal 1:

Variables: J A L KL
IH : forall J A K L KL, adj J A K * -> append K L KL ->
       (exists JL, append J L JL /\ adj JL A KL)
H2 : append (A :: J) L KL
H3 : is_o A
H4 : is_list J
============================
 exists JL, append J L JL /\ adj JL A KL

Subgoal 2 is:
 exists JL, append (B :: K1) L JL /\ adj JL A KL

adj_append_1 < case H2.
Subgoal 1:

Variables: J A L L1
IH : forall J A K L KL, adj J A K * -> append K L KL ->
       (exists JL, append J L JL /\ adj JL A KL)
H3 : is_o A
H4 : is_list J
H5 : is_o A
H6 : append J L L1
============================
 exists JL, append J L JL /\ adj JL A (A :: L1)

Subgoal 2 is:
 exists JL, append (B :: K1) L JL /\ adj JL A KL

adj_append_1 < apply append_2_is_list to H6.
Subgoal 1:

Variables: J A L L1
IH : forall J A K L KL, adj J A K * -> append K L KL ->
       (exists JL, append J L JL /\ adj JL A KL)
H3 : is_o A
H4 : is_list J
H5 : is_o A
H6 : append J L L1
H7 : is_list L
============================
 exists JL, append J L JL /\ adj JL A (A :: L1)

Subgoal 2 is:
 exists JL, append (B :: K1) L JL /\ adj JL A KL

adj_append_1 < apply append_3_is_list to H6.
Subgoal 1:

Variables: J A L L1
IH : forall J A K L KL, adj J A K * -> append K L KL ->
       (exists JL, append J L JL /\ adj JL A KL)
H3 : is_o A
H4 : is_list J
H5 : is_o A
H6 : append J L L1
H7 : is_list L
H8 : is_list L1
============================
 exists JL, append J L JL /\ adj JL A (A :: L1)

Subgoal 2 is:
 exists JL, append (B :: K1) L JL /\ adj JL A KL

adj_append_1 < search.
Subgoal 2:

Variables: A L KL L1 B K1
IH : forall J A K L KL, adj J A K * -> append K L KL ->
       (exists JL, append J L JL /\ adj JL A KL)
H2 : append (B :: L1) L KL
H3 : is_o B
H4 : adj K1 A L1 *
============================
 exists JL, append (B :: K1) L JL /\ adj JL A KL

adj_append_1 < case H2.
Subgoal 2:

Variables: A L L1 B K1 L2
IH : forall J A K L KL, adj J A K * -> append K L KL ->
       (exists JL, append J L JL /\ adj JL A KL)
H3 : is_o B
H4 : adj K1 A L1 *
H5 : is_o B
H6 : append L1 L L2
============================
 exists JL, append (B :: K1) L JL /\ adj JL A (B :: L2)

adj_append_1 < apply IH to H4 H6.
Subgoal 2:

Variables: A L L1 B K1 L2 JL
IH : forall J A K L KL, adj J A K * -> append K L KL ->
       (exists JL, append J L JL /\ adj JL A KL)
H3 : is_o B
H4 : adj K1 A L1 *
H5 : is_o B
H6 : append L1 L L2
H7 : append K1 L JL
H8 : adj JL A L2
============================
 exists JL, append (B :: K1) L JL /\ adj JL A (B :: L2)

adj_append_1 < search.
Proof completed.
Abella < Theorem adj_1_append : 
forall J A K L JL, adj J A K -> append J L JL ->
  (exists KL, append K L KL /\ adj JL A KL).


============================
 forall J A K L JL, adj J A K -> append J L JL ->
   (exists KL, append K L KL /\ adj JL A KL)

adj_1_append < induction on 1.

IH : forall J A K L JL, adj J A K * -> append J L JL ->
       (exists KL, append K L KL /\ adj JL A KL)
============================
 forall J A K L JL, adj J A K @ -> append J L JL ->
   (exists KL, append K L KL /\ adj JL A KL)

adj_1_append < intros.

Variables: J A K L JL
IH : forall J A K L JL, adj J A K * -> append J L JL ->
       (exists KL, append K L KL /\ adj JL A KL)
H1 : adj J A K @
H2 : append J L JL
============================
 exists KL, append K L KL /\ adj JL A KL

adj_1_append < case H1.
Subgoal 1:

Variables: J A L JL
IH : forall J A K L JL, adj J A K * -> append J L JL ->
       (exists KL, append K L KL /\ adj JL A KL)
H2 : append J L JL
H3 : is_o A
H4 : is_list J
============================
 exists KL, append (A :: J) L KL /\ adj JL A KL

Subgoal 2 is:
 exists KL, append (B :: L1) L KL /\ adj JL A KL

adj_1_append < apply append_2_is_list to H2.
Subgoal 1:

Variables: J A L JL
IH : forall J A K L JL, adj J A K * -> append J L JL ->
       (exists KL, append K L KL /\ adj JL A KL)
H2 : append J L JL
H3 : is_o A
H4 : is_list J
H5 : is_list L
============================
 exists KL, append (A :: J) L KL /\ adj JL A KL

Subgoal 2 is:
 exists KL, append (B :: L1) L KL /\ adj JL A KL

adj_1_append < apply append_3_is_list to H2.
Subgoal 1:

Variables: J A L JL
IH : forall J A K L JL, adj J A K * -> append J L JL ->
       (exists KL, append K L KL /\ adj JL A KL)
H2 : append J L JL
H3 : is_o A
H4 : is_list J
H5 : is_list L
H6 : is_list JL
============================
 exists KL, append (A :: J) L KL /\ adj JL A KL

Subgoal 2 is:
 exists KL, append (B :: L1) L KL /\ adj JL A KL

adj_1_append < search.
Subgoal 2:

Variables: A L JL L1 B K1
IH : forall J A K L JL, adj J A K * -> append J L JL ->
       (exists KL, append K L KL /\ adj JL A KL)
H2 : append (B :: K1) L JL
H3 : is_o B
H4 : adj K1 A L1 *
============================
 exists KL, append (B :: L1) L KL /\ adj JL A KL

adj_1_append < case H2.
Subgoal 2:

Variables: A L L1 B K1 L2
IH : forall J A K L JL, adj J A K * -> append J L JL ->
       (exists KL, append K L KL /\ adj JL A KL)
H3 : is_o B
H4 : adj K1 A L1 *
H5 : is_o B
H6 : append K1 L L2
============================
 exists KL, append (B :: L1) L KL /\ adj (B :: L2) A KL

adj_1_append < apply IH to H4 H6.
Subgoal 2:

Variables: A L L1 B K1 L2 KL
IH : forall J A K L JL, adj J A K * -> append J L JL ->
       (exists KL, append K L KL /\ adj JL A KL)
H3 : is_o B
H4 : adj K1 A L1 *
H5 : is_o B
H6 : append K1 L L2
H7 : append L1 L KL
H8 : adj L2 A KL
============================
 exists KL, append (B :: L1) L KL /\ adj (B :: L2) A KL

adj_1_append < search.
Proof completed.
Abella < Define perm : (list o) -> (list o) -> prop by 
perm nil nil;
perm K L := exists A KK LL, adj KK A K /\ adj LL A L /\ perm KK LL.

Abella < Theorem perm_1_is_list : 
forall K L, perm K L -> is_list K.


============================
 forall K L, perm K L -> is_list K

perm_1_is_list < intros.

Variables: K L
H1 : perm K L
============================
 is_list K

perm_1_is_list < case H1.
Subgoal 1:

============================
 is_list nil

Subgoal 2 is:
 is_list K

perm_1_is_list < search.
Subgoal 2:

Variables: K L A KK LL
H2 : adj KK A K
H3 : adj LL A L
H4 : perm KK LL
============================
 is_list K

perm_1_is_list < backchain adj_3_is_list.
Proof completed.
Abella < Theorem perm_2_is_list : 
forall K L, perm K L -> is_list L.


============================
 forall K L, perm K L -> is_list L

perm_2_is_list < intros.

Variables: K L
H1 : perm K L
============================
 is_list L

perm_2_is_list < case H1.
Subgoal 1:

============================
 is_list nil

Subgoal 2 is:
 is_list L

perm_2_is_list < search.
Subgoal 2:

Variables: K L A KK LL
H2 : adj KK A K
H3 : adj LL A L
H4 : perm KK LL
============================
 is_list L

perm_2_is_list < backchain adj_3_is_list.
Proof completed.
Abella < Theorem perm_refl : 
forall L, is_list L -> perm L L.


============================
 forall L, is_list L -> perm L L

perm_refl < induction on 1.

IH : forall L, is_list L * -> perm L L
============================
 forall L, is_list L @ -> perm L L

perm_refl < intros.

Variables: L
IH : forall L, is_list L * -> perm L L
H1 : is_list L @
============================
 perm L L

perm_refl < case H1.
Subgoal 1:

IH : forall L, is_list L * -> perm L L
============================
 perm nil nil

Subgoal 2 is:
 perm (A :: L1) (A :: L1)

perm_refl < search.
Subgoal 2:

Variables: L1 A
IH : forall L, is_list L * -> perm L L
H2 : is_o A
H3 : is_list L1 *
============================
 perm (A :: L1) (A :: L1)

perm_refl < apply IH to H3.
Subgoal 2:

Variables: L1 A
IH : forall L, is_list L * -> perm L L
H2 : is_o A
H3 : is_list L1 *
H4 : perm L1 L1
============================
 perm (A :: L1) (A :: L1)

perm_refl < search.
Proof completed.
Abella < Theorem perm_sym : 
forall K L, perm K L -> perm L K.


============================
 forall K L, perm K L -> perm L K

perm_sym < induction on 1.

IH : forall K L, perm K L * -> perm L K
============================
 forall K L, perm K L @ -> perm L K

perm_sym < intros.

Variables: K L
IH : forall K L, perm K L * -> perm L K
H1 : perm K L @
============================
 perm L K

perm_sym < case H1.
Subgoal 1:

IH : forall K L, perm K L * -> perm L K
============================
 perm nil nil

Subgoal 2 is:
 perm L K

perm_sym < search.
Subgoal 2:

Variables: K L A KK LL
IH : forall K L, perm K L * -> perm L K
H2 : adj KK A K
H3 : adj LL A L
H4 : perm KK LL *
============================
 perm L K

perm_sym < apply IH to H4.
Subgoal 2:

Variables: K L A KK LL
IH : forall K L, perm K L * -> perm L K
H2 : adj KK A K
H3 : adj LL A L
H4 : perm KK LL *
H5 : perm LL KK
============================
 perm L K

perm_sym < search.
Proof completed.
Abella < Theorem perm_cons_1 : 
forall A K L, perm (A :: K) L -> (exists J, adj J A L /\ perm K J).


============================
 forall A K L, perm (A :: K) L -> (exists J, adj J A L /\ perm K J)

perm_cons_1 < induction on 1.

IH : forall A K L, perm (A :: K) L * -> (exists J, adj J A L /\ perm K J)
============================
 forall A K L, perm (A :: K) L @ -> (exists J, adj J A L /\ perm K J)

perm_cons_1 < intros.

Variables: A K L
IH : forall A K L, perm (A :: K) L * -> (exists J, adj J A L /\ perm K J)
H1 : perm (A :: K) L @
============================
 exists J, adj J A L /\ perm K J

perm_cons_1 < case H1.

Variables: A K L A1 KK LL
IH : forall A K L, perm (A :: K) L * -> (exists J, adj J A L /\ perm K J)
H2 : adj KK A1 (A :: K)
H3 : adj LL A1 L
H4 : perm KK LL *
============================
 exists J, adj J A L /\ perm K J

perm_cons_1 < case H2.
Subgoal 1:

Variables: A K L LL
IH : forall A K L, perm (A :: K) L * -> (exists J, adj J A L /\ perm K J)
H3 : adj LL A L
H4 : perm K LL *
H5 : is_o A
H6 : is_list K
============================
 exists J, adj J A L /\ perm K J

Subgoal 2 is:
 exists J, adj J A L /\ perm K J

perm_cons_1 < search.
Subgoal 2:

Variables: A K L A1 LL K1
IH : forall A K L, perm (A :: K) L * -> (exists J, adj J A L /\ perm K J)
H3 : adj LL A1 L
H4 : perm (A :: K1) LL *
H5 : is_o A
H6 : adj K1 A1 K
============================
 exists J, adj J A L /\ perm K J

perm_cons_1 < apply IH to H4.
Subgoal 2:

Variables: A K L A1 LL K1 J
IH : forall A K L, perm (A :: K) L * -> (exists J, adj J A L /\ perm K J)
H3 : adj LL A1 L
H4 : perm (A :: K1) LL *
H5 : is_o A
H6 : adj K1 A1 K
H7 : adj J A LL
H8 : perm K1 J
============================
 exists J, adj J A L /\ perm K J

perm_cons_1 < apply adj_swap to H7 H3.
Subgoal 2:

Variables: A K L A1 LL K1 J U
IH : forall A K L, perm (A :: K) L * -> (exists J, adj J A L /\ perm K J)
H3 : adj LL A1 L
H4 : perm (A :: K1) LL *
H5 : is_o A
H6 : adj K1 A1 K
H7 : adj J A LL
H8 : perm K1 J
H9 : adj J A1 U
H10 : adj U A L
============================
 exists J, adj J A L /\ perm K J

perm_cons_1 < apply adj_1_is_list to H6.
Subgoal 2:

Variables: A K L A1 LL K1 J U
IH : forall A K L, perm (A :: K) L * -> (exists J, adj J A L /\ perm K J)
H3 : adj LL A1 L
H4 : perm (A :: K1) LL *
H5 : is_o A
H6 : adj K1 A1 K
H7 : adj J A LL
H8 : perm K1 J
H9 : adj J A1 U
H10 : adj U A L
H11 : is_list K1
============================
 exists J, adj J A L /\ perm K J

perm_cons_1 < apply adj_1_is_list to H7.
Subgoal 2:

Variables: A K L A1 LL K1 J U
IH : forall A K L, perm (A :: K) L * -> (exists J, adj J A L /\ perm K J)
H3 : adj LL A1 L
H4 : perm (A :: K1) LL *
H5 : is_o A
H6 : adj K1 A1 K
H7 : adj J A LL
H8 : perm K1 J
H9 : adj J A1 U
H10 : adj U A L
H11 : is_list K1
H12 : is_list J
============================
 exists J, adj J A L /\ perm K J

perm_cons_1 < search.
Proof completed.
Abella < Theorem perm_cons_2 : 
forall A K L, perm K (A :: L) -> (exists J, adj J A K /\ perm J L).


============================
 forall A K L, perm K (A :: L) -> (exists J, adj J A K /\ perm J L)

perm_cons_2 < intros.

Variables: A K L
H1 : perm K (A :: L)
============================
 exists J, adj J A K /\ perm J L

perm_cons_2 < apply perm_sym to *H1.

Variables: A K L
H2 : perm (A :: L) K
============================
 exists J, adj J A K /\ perm J L

perm_cons_2 < apply perm_cons_1 to *H2.

Variables: A K L J
H3 : adj J A K
H4 : perm L J
============================
 exists J, adj J A K /\ perm J L

perm_cons_2 < apply perm_sym to *H4.

Variables: A K L J
H3 : adj J A K
H5 : perm J L
============================
 exists J, adj J A K /\ perm J L

perm_cons_2 < search.
Proof completed.
Abella < Theorem adj_preserves_perm : 
forall A JJ J KK K, adj JJ A J -> adj KK A K -> perm JJ KK -> perm J K.


============================
 forall A JJ J KK K, adj JJ A J -> adj KK A K -> perm JJ KK -> perm J K

adj_preserves_perm < intros.

Variables: A JJ J KK K
H1 : adj JJ A J
H2 : adj KK A K
H3 : perm JJ KK
============================
 perm J K

adj_preserves_perm < search.
Proof completed.
Abella < Theorem perm_trans_lem : 
forall J K L, is_list K -> perm J K -> perm K L -> perm J L.


============================
 forall J K L, is_list K -> perm J K -> perm K L -> perm J L

perm_trans_lem < induction on 1.

IH : forall J K L, is_list K * -> perm J K -> perm K L -> perm J L
============================
 forall J K L, is_list K @ -> perm J K -> perm K L -> perm J L

perm_trans_lem < intros.

Variables: J K L
IH : forall J K L, is_list K * -> perm J K -> perm K L -> perm J L
H1 : is_list K @
H2 : perm J K
H3 : perm K L
============================
 perm J L

perm_trans_lem < case H1.
Subgoal 1:

Variables: J L
IH : forall J K L, is_list K * -> perm J K -> perm K L -> perm J L
H2 : perm J nil
H3 : perm nil L
============================
 perm J L

Subgoal 2 is:
 perm J L

perm_trans_lem < case H2.
Subgoal 1.1:

Variables: L
IH : forall J K L, is_list K * -> perm J K -> perm K L -> perm J L
H3 : perm nil L
============================
 perm nil L

Subgoal 1.2 is:
 perm J L

Subgoal 2 is:
 perm J L

perm_trans_lem < case H3.
Subgoal 1.1.1:

IH : forall J K L, is_list K * -> perm J K -> perm K L -> perm J L
============================
 perm nil nil

Subgoal 1.1.2 is:
 perm nil L

Subgoal 1.2 is:
 perm J L

Subgoal 2 is:
 perm J L

perm_trans_lem < search.
Subgoal 1.1.2:

Variables: L A KK LL
IH : forall J K L, is_list K * -> perm J K -> perm K L -> perm J L
H4 : adj KK A nil
H5 : adj LL A L
H6 : perm KK LL
============================
 perm nil L

Subgoal 1.2 is:
 perm J L

Subgoal 2 is:
 perm J L

perm_trans_lem < case H4.
Subgoal 1.2:

Variables: J L A KK LL
IH : forall J K L, is_list K * -> perm J K -> perm K L -> perm J L
H3 : perm nil L
H4 : adj KK A J
H5 : adj LL A nil
H6 : perm KK LL
============================
 perm J L

Subgoal 2 is:
 perm J L

perm_trans_lem < case H5.
Subgoal 2:

Variables: J L L1 A
IH : forall J K L, is_list K * -> perm J K -> perm K L -> perm J L
H2 : perm J (A :: L1)
H3 : perm (A :: L1) L
H4 : is_o A
H5 : is_list L1 *
============================
 perm J L

perm_trans_lem < case H2.
Subgoal 2:

Variables: J L L1 A A1 KK LL
IH : forall J K L, is_list K * -> perm J K -> perm K L -> perm J L
H3 : perm (A :: L1) L
H4 : is_o A
H5 : is_list L1 *
H6 : adj KK A1 J
H7 : adj LL A1 (A :: L1)
H8 : perm KK LL
============================
 perm J L

perm_trans_lem < case H3.
Subgoal 2:

Variables: J L L1 A A1 KK LL A2 KK1 LL1
IH : forall J K L, is_list K * -> perm J K -> perm K L -> perm J L
H4 : is_o A
H5 : is_list L1 *
H6 : adj KK A1 J
H7 : adj LL A1 (A :: L1)
H8 : perm KK LL
H9 : adj KK1 A2 (A :: L1)
H10 : adj LL1 A2 L
H11 : perm KK1 LL1
============================
 perm J L

perm_trans_lem < case H7.
Subgoal 2.1:

Variables: J L L1 A KK A2 KK1 LL1
IH : forall J K L, is_list K * -> perm J K -> perm K L -> perm J L
H4 : is_o A
H5 : is_list L1 *
H6 : adj KK A J
H8 : perm KK L1
H9 : adj KK1 A2 (A :: L1)
H10 : adj LL1 A2 L
H11 : perm KK1 LL1
H12 : is_o A
H13 : is_list L1
============================
 perm J L

Subgoal 2.2 is:
 perm J L

perm_trans_lem < case H9.
Subgoal 2.1.1:

Variables: J L L1 A KK LL1
IH : forall J K L, is_list K * -> perm J K -> perm K L -> perm J L
H4 : is_o A
H5 : is_list L1 *
H6 : adj KK A J
H8 : perm KK L1
H10 : adj LL1 A L
H11 : perm L1 LL1
H12 : is_o A
H13 : is_list L1
H14 : is_o A
H15 : is_list L1
============================
 perm J L

Subgoal 2.1.2 is:
 perm J L

Subgoal 2.2 is:
 perm J L

perm_trans_lem < apply IH to *H5 *H8 *H11.
Subgoal 2.1.1:

Variables: J L L1 A KK LL1
IH : forall J K L, is_list K * -> perm J K -> perm K L -> perm J L
H4 : is_o A
H6 : adj KK A J
H10 : adj LL1 A L
H12 : is_o A
H13 : is_list L1
H14 : is_o A
H15 : is_list L1
H16 : perm KK LL1
============================
 perm J L

Subgoal 2.1.2 is:
 perm J L

Subgoal 2.2 is:
 perm J L

perm_trans_lem < search.
Subgoal 2.1.2:

Variables: J L L1 A KK A2 LL1 K1
IH : forall J K L, is_list K * -> perm J K -> perm K L -> perm J L
H4 : is_o A
H5 : is_list L1 *
H6 : adj KK A J
H8 : perm KK L1
H10 : adj LL1 A2 L
H11 : perm (A :: K1) LL1
H12 : is_o A
H13 : is_list L1
H14 : is_o A
H15 : adj K1 A2 L1
============================
 perm J L

Subgoal 2.2 is:
 perm J L

perm_trans_lem < apply perm_cons_1 to *H11.
Subgoal 2.1.2:

Variables: J L L1 A KK A2 LL1 K1 J1
IH : forall J K L, is_list K * -> perm J K -> perm K L -> perm J L
H4 : is_o A
H5 : is_list L1 *
H6 : adj KK A J
H8 : perm KK L1
H10 : adj LL1 A2 L
H12 : is_o A
H13 : is_list L1
H14 : is_o A
H15 : adj K1 A2 L1
H16 : adj J1 A LL1
H17 : perm K1 J1
============================
 perm J L

Subgoal 2.2 is:
 perm J L

perm_trans_lem < apply adj_swap to *H16 *H10.
Subgoal 2.1.2:

Variables: J L L1 A KK A2 LL1 K1 J1 U
IH : forall J K L, is_list K * -> perm J K -> perm K L -> perm J L
H4 : is_o A
H5 : is_list L1 *
H6 : adj KK A J
H8 : perm KK L1
H12 : is_o A
H13 : is_list L1
H14 : is_o A
H15 : adj K1 A2 L1
H17 : perm K1 J1
H18 : adj J1 A2 U
H19 : adj U A L
============================
 perm J L

Subgoal 2.2 is:
 perm J L

perm_trans_lem < apply adj_preserves_perm to *H15 *H18 *H17.
Subgoal 2.1.2:

Variables: J L L1 A KK A2 LL1 K1 J1 U
IH : forall J K L, is_list K * -> perm J K -> perm K L -> perm J L
H4 : is_o A
H5 : is_list L1 *
H6 : adj KK A J
H8 : perm KK L1
H12 : is_o A
H13 : is_list L1
H14 : is_o A
H19 : adj U A L
H20 : perm L1 U
============================
 perm J L

Subgoal 2.2 is:
 perm J L

perm_trans_lem < apply IH to *H5 *H8 *H20.
Subgoal 2.1.2:

Variables: J L L1 A KK A2 LL1 K1 J1 U
IH : forall J K L, is_list K * -> perm J K -> perm K L -> perm J L
H4 : is_o A
H6 : adj KK A J
H12 : is_o A
H13 : is_list L1
H14 : is_o A
H19 : adj U A L
H21 : perm KK U
============================
 perm J L

Subgoal 2.2 is:
 perm J L

perm_trans_lem < backchain adj_preserves_perm.
Subgoal 2.2:

Variables: J L L1 A A1 KK A2 KK1 LL1 K1
IH : forall J K L, is_list K * -> perm J K -> perm K L -> perm J L
H4 : is_o A
H5 : is_list L1 *
H6 : adj KK A1 J
H8 : perm KK (A :: K1)
H9 : adj KK1 A2 (A :: L1)
H10 : adj LL1 A2 L
H11 : perm KK1 LL1
H12 : is_o A
H13 : adj K1 A1 L1
============================
 perm J L

perm_trans_lem < apply perm_cons_2 to *H8.
Subgoal 2.2:

Variables: J L L1 A A1 KK A2 KK1 LL1 K1 J1
IH : forall J K L, is_list K * -> perm J K -> perm K L -> perm J L
H4 : is_o A
H5 : is_list L1 *
H6 : adj KK A1 J
H9 : adj KK1 A2 (A :: L1)
H10 : adj LL1 A2 L
H11 : perm KK1 LL1
H12 : is_o A
H13 : adj K1 A1 L1
H14 : adj J1 A KK
H15 : perm J1 K1
============================
 perm J L

perm_trans_lem < apply adj_swap to *H14 *H6.
Subgoal 2.2:

Variables: J L L1 A A1 KK A2 KK1 LL1 K1 J1 U
IH : forall J K L, is_list K * -> perm J K -> perm K L -> perm J L
H4 : is_o A
H5 : is_list L1 *
H9 : adj KK1 A2 (A :: L1)
H10 : adj LL1 A2 L
H11 : perm KK1 LL1
H12 : is_o A
H13 : adj K1 A1 L1
H15 : perm J1 K1
H16 : adj J1 A1 U
H17 : adj U A J
============================
 perm J L

perm_trans_lem < apply adj_preserves_perm to *H16 *H13 *H15.
Subgoal 2.2:

Variables: J L L1 A A1 KK A2 KK1 LL1 K1 J1 U
IH : forall J K L, is_list K * -> perm J K -> perm K L -> perm J L
H4 : is_o A
H5 : is_list L1 *
H9 : adj KK1 A2 (A :: L1)
H10 : adj LL1 A2 L
H11 : perm KK1 LL1
H12 : is_o A
H17 : adj U A J
H18 : perm U L1
============================
 perm J L

perm_trans_lem < apply adj_preserves_perm to *H9 *H10 *H11.
Subgoal 2.2:

Variables: J L L1 A A1 KK A2 KK1 LL1 K1 J1 U
IH : forall J K L, is_list K * -> perm J K -> perm K L -> perm J L
H4 : is_o A
H5 : is_list L1 *
H12 : is_o A
H17 : adj U A J
H18 : perm U L1
H19 : perm (A :: L1) L
============================
 perm J L

perm_trans_lem < apply perm_cons_1 to *H19.
Subgoal 2.2:

Variables: J L L1 A A1 KK A2 KK1 LL1 K1 J1 U J2
IH : forall J K L, is_list K * -> perm J K -> perm K L -> perm J L
H4 : is_o A
H5 : is_list L1 *
H12 : is_o A
H17 : adj U A J
H18 : perm U L1
H20 : adj J2 A L
H21 : perm L1 J2
============================
 perm J L

perm_trans_lem < apply IH to *H5 *H18 *H21.
Subgoal 2.2:

Variables: J L L1 A A1 KK A2 KK1 LL1 K1 J1 U J2
IH : forall J K L, is_list K * -> perm J K -> perm K L -> perm J L
H4 : is_o A
H12 : is_o A
H17 : adj U A J
H20 : adj J2 A L
H22 : perm U J2
============================
 perm J L

perm_trans_lem < backchain adj_preserves_perm.
Proof completed.
Abella < Theorem perm_trans : 
forall J K L, perm J K -> perm K L -> perm J L.


============================
 forall J K L, perm J K -> perm K L -> perm J L

perm_trans < intros.

Variables: J K L
H1 : perm J K
H2 : perm K L
============================
 perm J L

perm_trans < apply perm_2_is_list to H1.

Variables: J K L
H1 : perm J K
H2 : perm K L
H3 : is_list K
============================
 perm J L

perm_trans < backchain perm_trans_lem.
Proof completed.
Abella < Theorem adj_same_source : 
forall J A K L, adj J A K -> adj J A L -> perm K L.


============================
 forall J A K L, adj J A K -> adj J A L -> perm K L

adj_same_source < intros.

Variables: J A K L
H1 : adj J A K
H2 : adj J A L
============================
 perm K L

adj_same_source < apply adj_1_is_list to H1.

Variables: J A K L
H1 : adj J A K
H2 : adj J A L
H3 : is_list J
============================
 perm K L

adj_same_source < apply perm_refl to H3.

Variables: J A K L
H1 : adj J A K
H2 : adj J A L
H3 : is_list J
H4 : perm J J
============================
 perm K L

adj_same_source < search.
Proof completed.
Abella < Theorem adj_same_result : 
forall J K A L, adj J A L -> adj K A L -> perm J K.


============================
 forall J K A L, adj J A L -> adj K A L -> perm J K

adj_same_result < induction on 1.

IH : forall J K A L, adj J A L * -> adj K A L -> perm J K
============================
 forall J K A L, adj J A L @ -> adj K A L -> perm J K

adj_same_result < intros.

Variables: J K A L
IH : forall J K A L, adj J A L * -> adj K A L -> perm J K
H1 : adj J A L @
H2 : adj K A L
============================
 perm J K

adj_same_result < case H1.
Subgoal 1:

Variables: J K A
IH : forall J K A L, adj J A L * -> adj K A L -> perm J K
H2 : adj K A (A :: J)
H3 : is_o A
H4 : is_list J
============================
 perm J K

Subgoal 2 is:
 perm (B :: K1) K

adj_same_result < case H2.
Subgoal 1.1:

Variables: J A
IH : forall J K A L, adj J A L * -> adj K A L -> perm J K
H3 : is_o A
H4 : is_list J
H5 : is_o A
H6 : is_list J
============================
 perm J J

Subgoal 1.2 is:
 perm J (A :: K1)

Subgoal 2 is:
 perm (B :: K1) K

adj_same_result < backchain perm_refl.
Subgoal 1.2:

Variables: J A K1
IH : forall J K A L, adj J A L * -> adj K A L -> perm J K
H3 : is_o A
H4 : is_list J
H5 : is_o A
H6 : adj K1 A J
============================
 perm J (A :: K1)

Subgoal 2 is:
 perm (B :: K1) K

adj_same_result < apply adj_1_is_list to H6.
Subgoal 1.2:

Variables: J A K1
IH : forall J K A L, adj J A L * -> adj K A L -> perm J K
H3 : is_o A
H4 : is_list J
H5 : is_o A
H6 : adj K1 A J
H7 : is_list K1
============================
 perm J (A :: K1)

Subgoal 2 is:
 perm (B :: K1) K

adj_same_result < apply perm_refl to H7.
Subgoal 1.2:

Variables: J A K1
IH : forall J K A L, adj J A L * -> adj K A L -> perm J K
H3 : is_o A
H4 : is_list J
H5 : is_o A
H6 : adj K1 A J
H7 : is_list K1
H8 : perm K1 K1
============================
 perm J (A :: K1)

Subgoal 2 is:
 perm (B :: K1) K

adj_same_result < search.
Subgoal 2:

Variables: K A L1 B K1
IH : forall J K A L, adj J A L * -> adj K A L -> perm J K
H2 : adj K A (B :: L1)
H3 : is_o B
H4 : adj K1 A L1 *
============================
 perm (B :: K1) K

adj_same_result < case H2.
Subgoal 2.1:

Variables: L1 B K1
IH : forall J K A L, adj J A L * -> adj K A L -> perm J K
H3 : is_o B
H4 : adj K1 B L1 *
H5 : is_o B
H6 : is_list L1
============================
 perm (B :: K1) L1

Subgoal 2.2 is:
 perm (B :: K1) (B :: K2)

adj_same_result < apply adj_1_is_list to H4.
Subgoal 2.1:

Variables: L1 B K1
IH : forall J K A L, adj J A L * -> adj K A L -> perm J K
H3 : is_o B
H4 : adj K1 B L1 *
H5 : is_o B
H6 : is_list L1
H7 : is_list K1
============================
 perm (B :: K1) L1

Subgoal 2.2 is:
 perm (B :: K1) (B :: K2)

adj_same_result < apply perm_refl to H7.
Subgoal 2.1:

Variables: L1 B K1
IH : forall J K A L, adj J A L * -> adj K A L -> perm J K
H3 : is_o B
H4 : adj K1 B L1 *
H5 : is_o B
H6 : is_list L1
H7 : is_list K1
H8 : perm K1 K1
============================
 perm (B :: K1) L1

Subgoal 2.2 is:
 perm (B :: K1) (B :: K2)

adj_same_result < search.
Subgoal 2.2:

Variables: A L1 B K1 K2
IH : forall J K A L, adj J A L * -> adj K A L -> perm J K
H3 : is_o B
H4 : adj K1 A L1 *
H5 : is_o B
H6 : adj K2 A L1
============================
 perm (B :: K1) (B :: K2)

adj_same_result < apply IH to H4 H6.
Subgoal 2.2:

Variables: A L1 B K1 K2
IH : forall J K A L, adj J A L * -> adj K A L -> perm J K
H3 : is_o B
H4 : adj K1 A L1 *
H5 : is_o B
H6 : adj K2 A L1
H7 : perm K1 K2
============================
 perm (B :: K1) (B :: K2)

adj_same_result < apply adj_1_is_list to H4.
Subgoal 2.2:

Variables: A L1 B K1 K2
IH : forall J K A L, adj J A L * -> adj K A L -> perm J K
H3 : is_o B
H4 : adj K1 A L1 *
H5 : is_o B
H6 : adj K2 A L1
H7 : perm K1 K2
H8 : is_list K1
============================
 perm (B :: K1) (B :: K2)

adj_same_result < apply adj_1_is_list to H6.
Subgoal 2.2:

Variables: A L1 B K1 K2
IH : forall J K A L, adj J A L * -> adj K A L -> perm J K
H3 : is_o B
H4 : adj K1 A L1 *
H5 : is_o B
H6 : adj K2 A L1
H7 : perm K1 K2
H8 : is_list K1
H9 : is_list K2
============================
 perm (B :: K1) (B :: K2)

adj_same_result < search.
Proof completed.
Abella < Theorem adj_same_result_diff : 
forall J A K B L, adj J A L -> adj K B L -> A = B /\ perm J K \/
  (exists KK, adj KK A K).


============================
 forall J A K B L, adj J A L -> adj K B L -> A = B /\ perm J K \/
   (exists KK, adj KK A K)

adj_same_result_diff < induction on 1.

IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists KK, adj KK A K)
============================
 forall J A K B L, adj J A L @ -> adj K B L -> A = B /\ perm J K \/
   (exists KK, adj KK A K)

adj_same_result_diff < intros.

Variables: J A K B L
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists KK, adj KK A K)
H1 : adj J A L @
H2 : adj K B L
============================
 A = B /\ perm J K \/ (exists KK, adj KK A K)

adj_same_result_diff < case H1.
Subgoal 1:

Variables: J A K B
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists KK, adj KK A K)
H2 : adj K B (A :: J)
H3 : is_o A
H4 : is_list J
============================
 A = B /\ perm J K \/ (exists KK, adj KK A K)

Subgoal 2 is:
 A = B /\ perm (B1 :: K1) K \/ (exists KK, adj KK A K)

adj_same_result_diff < case H2.
Subgoal 1.1:

Variables: J A
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists KK, adj KK A K)
H3 : is_o A
H4 : is_list J
H5 : is_o A
H6 : is_list J
============================
 A = A /\ perm J J \/ (exists KK, adj KK A J)

Subgoal 1.2 is:
 A = B /\ perm J (A :: K1) \/ (exists KK, adj KK A (A :: K1))

Subgoal 2 is:
 A = B /\ perm (B1 :: K1) K \/ (exists KK, adj KK A K)

adj_same_result_diff < apply perm_refl to H4.
Subgoal 1.1:

Variables: J A
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists KK, adj KK A K)
H3 : is_o A
H4 : is_list J
H5 : is_o A
H6 : is_list J
H7 : perm J J
============================
 A = A /\ perm J J \/ (exists KK, adj KK A J)

Subgoal 1.2 is:
 A = B /\ perm J (A :: K1) \/ (exists KK, adj KK A (A :: K1))

Subgoal 2 is:
 A = B /\ perm (B1 :: K1) K \/ (exists KK, adj KK A K)

adj_same_result_diff < search.
Subgoal 1.2:

Variables: J A B K1
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists KK, adj KK A K)
H3 : is_o A
H4 : is_list J
H5 : is_o A
H6 : adj K1 B J
============================
 A = B /\ perm J (A :: K1) \/ (exists KK, adj KK A (A :: K1))

Subgoal 2 is:
 A = B /\ perm (B1 :: K1) K \/ (exists KK, adj KK A K)

adj_same_result_diff < right.
Subgoal 1.2:

Variables: J A B K1
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists KK, adj KK A K)
H3 : is_o A
H4 : is_list J
H5 : is_o A
H6 : adj K1 B J
============================
 exists KK, adj KK A (A :: K1)

Subgoal 2 is:
 A = B /\ perm (B1 :: K1) K \/ (exists KK, adj KK A K)

adj_same_result_diff < witness K1.
Subgoal 1.2:

Variables: J A B K1
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists KK, adj KK A K)
H3 : is_o A
H4 : is_list J
H5 : is_o A
H6 : adj K1 B J
============================
 adj K1 A (A :: K1)

Subgoal 2 is:
 A = B /\ perm (B1 :: K1) K \/ (exists KK, adj KK A K)

adj_same_result_diff < apply adj_1_is_list to H6.
Subgoal 1.2:

Variables: J A B K1
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists KK, adj KK A K)
H3 : is_o A
H4 : is_list J
H5 : is_o A
H6 : adj K1 B J
H7 : is_list K1
============================
 adj K1 A (A :: K1)

Subgoal 2 is:
 A = B /\ perm (B1 :: K1) K \/ (exists KK, adj KK A K)

adj_same_result_diff < search.
Subgoal 2:

Variables: A K B L1 B1 K1
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists KK, adj KK A K)
H2 : adj K B (B1 :: L1)
H3 : is_o B1
H4 : adj K1 A L1 *
============================
 A = B /\ perm (B1 :: K1) K \/ (exists KK, adj KK A K)

adj_same_result_diff < case H2.
Subgoal 2.1:

Variables: A L1 B1 K1
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists KK, adj KK A K)
H3 : is_o B1
H4 : adj K1 A L1 *
H5 : is_o B1
H6 : is_list L1
============================
 A = B1 /\ perm (B1 :: K1) L1 \/ (exists KK, adj KK A L1)

Subgoal 2.2 is:
 A = B /\ perm (B1 :: K1) (B1 :: K2) \/ (exists KK, adj KK A (B1 :: K2))

adj_same_result_diff < right.
Subgoal 2.1:

Variables: A L1 B1 K1
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists KK, adj KK A K)
H3 : is_o B1
H4 : adj K1 A L1 *
H5 : is_o B1
H6 : is_list L1
============================
 exists KK, adj KK A L1

Subgoal 2.2 is:
 A = B /\ perm (B1 :: K1) (B1 :: K2) \/ (exists KK, adj KK A (B1 :: K2))

adj_same_result_diff < search.
Subgoal 2.2:

Variables: A B L1 B1 K1 K2
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists KK, adj KK A K)
H3 : is_o B1
H4 : adj K1 A L1 *
H5 : is_o B1
H6 : adj K2 B L1
============================
 A = B /\ perm (B1 :: K1) (B1 :: K2) \/ (exists KK, adj KK A (B1 :: K2))

adj_same_result_diff < apply IH to H4 H6.
Subgoal 2.2:

Variables: A B L1 B1 K1 K2
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists KK, adj KK A K)
H3 : is_o B1
H4 : adj K1 A L1 *
H5 : is_o B1
H6 : adj K2 B L1
H7 : A = B /\ perm K1 K2 \/ (exists KK, adj KK A K2)
============================
 A = B /\ perm (B1 :: K1) (B1 :: K2) \/ (exists KK, adj KK A (B1 :: K2))

adj_same_result_diff < case H7.
Subgoal 2.2.1:

Variables: B L1 B1 K1 K2
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists KK, adj KK A K)
H3 : is_o B1
H4 : adj K1 B L1 *
H5 : is_o B1
H6 : adj K2 B L1
H8 : perm K1 K2
============================
 B = B /\ perm (B1 :: K1) (B1 :: K2) \/ (exists KK, adj KK B (B1 :: K2))

Subgoal 2.2.2 is:
 A = B /\ perm (B1 :: K1) (B1 :: K2) \/ (exists KK, adj KK A (B1 :: K2))

adj_same_result_diff < apply adj_1_is_list to H4.
Subgoal 2.2.1:

Variables: B L1 B1 K1 K2
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists KK, adj KK A K)
H3 : is_o B1
H4 : adj K1 B L1 *
H5 : is_o B1
H6 : adj K2 B L1
H8 : perm K1 K2
H9 : is_list K1
============================
 B = B /\ perm (B1 :: K1) (B1 :: K2) \/ (exists KK, adj KK B (B1 :: K2))

Subgoal 2.2.2 is:
 A = B /\ perm (B1 :: K1) (B1 :: K2) \/ (exists KK, adj KK A (B1 :: K2))

adj_same_result_diff < apply adj_1_is_list to H6.
Subgoal 2.2.1:

Variables: B L1 B1 K1 K2
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists KK, adj KK A K)
H3 : is_o B1
H4 : adj K1 B L1 *
H5 : is_o B1
H6 : adj K2 B L1
H8 : perm K1 K2
H9 : is_list K1
H10 : is_list K2
============================
 B = B /\ perm (B1 :: K1) (B1 :: K2) \/ (exists KK, adj KK B (B1 :: K2))

Subgoal 2.2.2 is:
 A = B /\ perm (B1 :: K1) (B1 :: K2) \/ (exists KK, adj KK A (B1 :: K2))

adj_same_result_diff < search.
Subgoal 2.2.2:

Variables: A B L1 B1 K1 K2 KK
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists KK, adj KK A K)
H3 : is_o B1
H4 : adj K1 A L1 *
H5 : is_o B1
H6 : adj K2 B L1
H8 : adj KK A K2
============================
 A = B /\ perm (B1 :: K1) (B1 :: K2) \/ (exists KK, adj KK A (B1 :: K2))

adj_same_result_diff < search.
Proof completed.
Abella < Theorem adj_same_result_diff_both : 
forall J A K B L, adj J A L -> adj K B L -> A = B /\ perm J K \/
  (exists JJ KK, adj JJ B J /\ adj KK A K /\ perm JJ KK).


============================
 forall J A K B L, adj J A L -> adj K B L -> A = B /\ perm J K \/
   (exists JJ KK, adj JJ B J /\ adj KK A K /\ perm JJ KK)

adj_same_result_diff_both < induction on 1.

IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists JJ KK, adj JJ B J /\ adj KK A K /\ perm JJ KK)
============================
 forall J A K B L, adj J A L @ -> adj K B L -> A = B /\ perm J K \/
   (exists JJ KK, adj JJ B J /\ adj KK A K /\ perm JJ KK)

adj_same_result_diff_both < intros.

Variables: J A K B L
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists JJ KK, adj JJ B J /\ adj KK A K /\ perm JJ KK)
H1 : adj J A L @
H2 : adj K B L
============================
 A = B /\ perm J K \/ (exists JJ KK, adj JJ B J /\ adj KK A K /\ perm JJ KK)

adj_same_result_diff_both < case H1.
Subgoal 1:

Variables: J A K B
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists JJ KK, adj JJ B J /\ adj KK A K /\ perm JJ KK)
H2 : adj K B (A :: J)
H3 : is_o A
H4 : is_list J
============================
 A = B /\ perm J K \/ (exists JJ KK, adj JJ B J /\ adj KK A K /\ perm JJ KK)

Subgoal 2 is:
 A = B /\ perm (B1 :: K1) K \/
   (exists JJ KK, adj JJ B (B1 :: K1) /\ adj KK A K /\ perm JJ KK)

adj_same_result_diff_both < case H2.
Subgoal 1.1:

Variables: J A
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists JJ KK, adj JJ B J /\ adj KK A K /\ perm JJ KK)
H3 : is_o A
H4 : is_list J
H5 : is_o A
H6 : is_list J
============================
 A = A /\ perm J J \/ (exists JJ KK, adj JJ A J /\ adj KK A J /\ perm JJ KK)

Subgoal 1.2 is:
 A = B /\ perm J (A :: K1) \/
   (exists JJ KK, adj JJ B J /\ adj KK A (A :: K1) /\ perm JJ KK)

Subgoal 2 is:
 A = B /\ perm (B1 :: K1) K \/
   (exists JJ KK, adj JJ B (B1 :: K1) /\ adj KK A K /\ perm JJ KK)

adj_same_result_diff_both < apply perm_refl to H4.
Subgoal 1.1:

Variables: J A
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists JJ KK, adj JJ B J /\ adj KK A K /\ perm JJ KK)
H3 : is_o A
H4 : is_list J
H5 : is_o A
H6 : is_list J
H7 : perm J J
============================
 A = A /\ perm J J \/ (exists JJ KK, adj JJ A J /\ adj KK A J /\ perm JJ KK)

Subgoal 1.2 is:
 A = B /\ perm J (A :: K1) \/
   (exists JJ KK, adj JJ B J /\ adj KK A (A :: K1) /\ perm JJ KK)

Subgoal 2 is:
 A = B /\ perm (B1 :: K1) K \/
   (exists JJ KK, adj JJ B (B1 :: K1) /\ adj KK A K /\ perm JJ KK)

adj_same_result_diff_both < search.
Subgoal 1.2:

Variables: J A B K1
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists JJ KK, adj JJ B J /\ adj KK A K /\ perm JJ KK)
H3 : is_o A
H4 : is_list J
H5 : is_o A
H6 : adj K1 B J
============================
 A = B /\ perm J (A :: K1) \/
   (exists JJ KK, adj JJ B J /\ adj KK A (A :: K1) /\ perm JJ KK)

Subgoal 2 is:
 A = B /\ perm (B1 :: K1) K \/
   (exists JJ KK, adj JJ B (B1 :: K1) /\ adj KK A K /\ perm JJ KK)

adj_same_result_diff_both < right.
Subgoal 1.2:

Variables: J A B K1
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists JJ KK, adj JJ B J /\ adj KK A K /\ perm JJ KK)
H3 : is_o A
H4 : is_list J
H5 : is_o A
H6 : adj K1 B J
============================
 exists JJ KK, adj JJ B J /\ adj KK A (A :: K1) /\ perm JJ KK

Subgoal 2 is:
 A = B /\ perm (B1 :: K1) K \/
   (exists JJ KK, adj JJ B (B1 :: K1) /\ adj KK A K /\ perm JJ KK)

adj_same_result_diff_both < witness K1, K1.
Subgoal 1.2:

Variables: J A B K1
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists JJ KK, adj JJ B J /\ adj KK A K /\ perm JJ KK)
H3 : is_o A
H4 : is_list J
H5 : is_o A
H6 : adj K1 B J
============================
 adj K1 B J /\ adj K1 A (A :: K1) /\ perm K1 K1

Subgoal 2 is:
 A = B /\ perm (B1 :: K1) K \/
   (exists JJ KK, adj JJ B (B1 :: K1) /\ adj KK A K /\ perm JJ KK)

adj_same_result_diff_both < apply adj_1_is_list to H6.
Subgoal 1.2:

Variables: J A B K1
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists JJ KK, adj JJ B J /\ adj KK A K /\ perm JJ KK)
H3 : is_o A
H4 : is_list J
H5 : is_o A
H6 : adj K1 B J
H7 : is_list K1
============================
 adj K1 B J /\ adj K1 A (A :: K1) /\ perm K1 K1

Subgoal 2 is:
 A = B /\ perm (B1 :: K1) K \/
   (exists JJ KK, adj JJ B (B1 :: K1) /\ adj KK A K /\ perm JJ KK)

adj_same_result_diff_both < apply perm_refl to H7.
Subgoal 1.2:

Variables: J A B K1
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists JJ KK, adj JJ B J /\ adj KK A K /\ perm JJ KK)
H3 : is_o A
H4 : is_list J
H5 : is_o A
H6 : adj K1 B J
H7 : is_list K1
H8 : perm K1 K1
============================
 adj K1 B J /\ adj K1 A (A :: K1) /\ perm K1 K1

Subgoal 2 is:
 A = B /\ perm (B1 :: K1) K \/
   (exists JJ KK, adj JJ B (B1 :: K1) /\ adj KK A K /\ perm JJ KK)

adj_same_result_diff_both < search.
Subgoal 2:

Variables: A K B L1 B1 K1
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists JJ KK, adj JJ B J /\ adj KK A K /\ perm JJ KK)
H2 : adj K B (B1 :: L1)
H3 : is_o B1
H4 : adj K1 A L1 *
============================
 A = B /\ perm (B1 :: K1) K \/
   (exists JJ KK, adj JJ B (B1 :: K1) /\ adj KK A K /\ perm JJ KK)

adj_same_result_diff_both < case H2.
Subgoal 2.1:

Variables: A L1 B1 K1
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists JJ KK, adj JJ B J /\ adj KK A K /\ perm JJ KK)
H3 : is_o B1
H4 : adj K1 A L1 *
H5 : is_o B1
H6 : is_list L1
============================
 A = B1 /\ perm (B1 :: K1) L1 \/
   (exists JJ KK, adj JJ B1 (B1 :: K1) /\ adj KK A L1 /\ perm JJ KK)

Subgoal 2.2 is:
 A = B /\ perm (B1 :: K1) (B1 :: K2) \/
   (exists JJ KK, adj JJ B (B1 :: K1) /\ adj KK A (B1 :: K2) /\ perm JJ KK)

adj_same_result_diff_both < right.
Subgoal 2.1:

Variables: A L1 B1 K1
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists JJ KK, adj JJ B J /\ adj KK A K /\ perm JJ KK)
H3 : is_o B1
H4 : adj K1 A L1 *
H5 : is_o B1
H6 : is_list L1
============================
 exists JJ KK, adj JJ B1 (B1 :: K1) /\ adj KK A L1 /\ perm JJ KK

Subgoal 2.2 is:
 A = B /\ perm (B1 :: K1) (B1 :: K2) \/
   (exists JJ KK, adj JJ B (B1 :: K1) /\ adj KK A (B1 :: K2) /\ perm JJ KK)

adj_same_result_diff_both < apply adj_1_is_list to H4.
Subgoal 2.1:

Variables: A L1 B1 K1
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists JJ KK, adj JJ B J /\ adj KK A K /\ perm JJ KK)
H3 : is_o B1
H4 : adj K1 A L1 *
H5 : is_o B1
H6 : is_list L1
H7 : is_list K1
============================
 exists JJ KK, adj JJ B1 (B1 :: K1) /\ adj KK A L1 /\ perm JJ KK

Subgoal 2.2 is:
 A = B /\ perm (B1 :: K1) (B1 :: K2) \/
   (exists JJ KK, adj JJ B (B1 :: K1) /\ adj KK A (B1 :: K2) /\ perm JJ KK)

adj_same_result_diff_both < apply perm_refl to H7.
Subgoal 2.1:

Variables: A L1 B1 K1
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists JJ KK, adj JJ B J /\ adj KK A K /\ perm JJ KK)
H3 : is_o B1
H4 : adj K1 A L1 *
H5 : is_o B1
H6 : is_list L1
H7 : is_list K1
H8 : perm K1 K1
============================
 exists JJ KK, adj JJ B1 (B1 :: K1) /\ adj KK A L1 /\ perm JJ KK

Subgoal 2.2 is:
 A = B /\ perm (B1 :: K1) (B1 :: K2) \/
   (exists JJ KK, adj JJ B (B1 :: K1) /\ adj KK A (B1 :: K2) /\ perm JJ KK)

adj_same_result_diff_both < search.
Subgoal 2.2:

Variables: A B L1 B1 K1 K2
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists JJ KK, adj JJ B J /\ adj KK A K /\ perm JJ KK)
H3 : is_o B1
H4 : adj K1 A L1 *
H5 : is_o B1
H6 : adj K2 B L1
============================
 A = B /\ perm (B1 :: K1) (B1 :: K2) \/
   (exists JJ KK, adj JJ B (B1 :: K1) /\ adj KK A (B1 :: K2) /\ perm JJ KK)

adj_same_result_diff_both < apply IH to H4 H6.
Subgoal 2.2:

Variables: A B L1 B1 K1 K2
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists JJ KK, adj JJ B J /\ adj KK A K /\ perm JJ KK)
H3 : is_o B1
H4 : adj K1 A L1 *
H5 : is_o B1
H6 : adj K2 B L1
H7 : A = B /\ perm K1 K2 \/
       (exists JJ KK, adj JJ B K1 /\ adj KK A K2 /\ perm JJ KK)
============================
 A = B /\ perm (B1 :: K1) (B1 :: K2) \/
   (exists JJ KK, adj JJ B (B1 :: K1) /\ adj KK A (B1 :: K2) /\ perm JJ KK)

adj_same_result_diff_both < case H7.
Subgoal 2.2.1:

Variables: B L1 B1 K1 K2
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists JJ KK, adj JJ B J /\ adj KK A K /\ perm JJ KK)
H3 : is_o B1
H4 : adj K1 B L1 *
H5 : is_o B1
H6 : adj K2 B L1
H8 : perm K1 K2
============================
 B = B /\ perm (B1 :: K1) (B1 :: K2) \/
   (exists JJ KK, adj JJ B (B1 :: K1) /\ adj KK B (B1 :: K2) /\ perm JJ KK)

Subgoal 2.2.2 is:
 A = B /\ perm (B1 :: K1) (B1 :: K2) \/
   (exists JJ KK, adj JJ B (B1 :: K1) /\ adj KK A (B1 :: K2) /\ perm JJ KK)

adj_same_result_diff_both < apply adj_1_is_list to H4.
Subgoal 2.2.1:

Variables: B L1 B1 K1 K2
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists JJ KK, adj JJ B J /\ adj KK A K /\ perm JJ KK)
H3 : is_o B1
H4 : adj K1 B L1 *
H5 : is_o B1
H6 : adj K2 B L1
H8 : perm K1 K2
H9 : is_list K1
============================
 B = B /\ perm (B1 :: K1) (B1 :: K2) \/
   (exists JJ KK, adj JJ B (B1 :: K1) /\ adj KK B (B1 :: K2) /\ perm JJ KK)

Subgoal 2.2.2 is:
 A = B /\ perm (B1 :: K1) (B1 :: K2) \/
   (exists JJ KK, adj JJ B (B1 :: K1) /\ adj KK A (B1 :: K2) /\ perm JJ KK)

adj_same_result_diff_both < apply adj_1_is_list to H6.
Subgoal 2.2.1:

Variables: B L1 B1 K1 K2
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists JJ KK, adj JJ B J /\ adj KK A K /\ perm JJ KK)
H3 : is_o B1
H4 : adj K1 B L1 *
H5 : is_o B1
H6 : adj K2 B L1
H8 : perm K1 K2
H9 : is_list K1
H10 : is_list K2
============================
 B = B /\ perm (B1 :: K1) (B1 :: K2) \/
   (exists JJ KK, adj JJ B (B1 :: K1) /\ adj KK B (B1 :: K2) /\ perm JJ KK)

Subgoal 2.2.2 is:
 A = B /\ perm (B1 :: K1) (B1 :: K2) \/
   (exists JJ KK, adj JJ B (B1 :: K1) /\ adj KK A (B1 :: K2) /\ perm JJ KK)

adj_same_result_diff_both < search.
Subgoal 2.2.2:

Variables: A B L1 B1 K1 K2 JJ KK
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists JJ KK, adj JJ B J /\ adj KK A K /\ perm JJ KK)
H3 : is_o B1
H4 : adj K1 A L1 *
H5 : is_o B1
H6 : adj K2 B L1
H8 : adj JJ B K1
H9 : adj KK A K2
H10 : perm JJ KK
============================
 A = B /\ perm (B1 :: K1) (B1 :: K2) \/
   (exists JJ KK, adj JJ B (B1 :: K1) /\ adj KK A (B1 :: K2) /\ perm JJ KK)

adj_same_result_diff_both < apply perm_1_is_list to H10.
Subgoal 2.2.2:

Variables: A B L1 B1 K1 K2 JJ KK
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists JJ KK, adj JJ B J /\ adj KK A K /\ perm JJ KK)
H3 : is_o B1
H4 : adj K1 A L1 *
H5 : is_o B1
H6 : adj K2 B L1
H8 : adj JJ B K1
H9 : adj KK A K2
H10 : perm JJ KK
H11 : is_list JJ
============================
 A = B /\ perm (B1 :: K1) (B1 :: K2) \/
   (exists JJ KK, adj JJ B (B1 :: K1) /\ adj KK A (B1 :: K2) /\ perm JJ KK)

adj_same_result_diff_both < apply perm_2_is_list to H10.
Subgoal 2.2.2:

Variables: A B L1 B1 K1 K2 JJ KK
IH : forall J A K B L, adj J A L * -> adj K B L -> A = B /\ perm J K \/
       (exists JJ KK, adj JJ B J /\ adj KK A K /\ perm JJ KK)
H3 : is_o B1
H4 : adj K1 A L1 *
H5 : is_o B1
H6 : adj K2 B L1
H8 : adj JJ B K1
H9 : adj KK A K2
H10 : perm JJ KK
H11 : is_list JJ
H12 : is_list KK
============================
 A = B /\ perm (B1 :: K1) (B1 :: K2) \/
   (exists JJ KK, adj JJ B (B1 :: K1) /\ adj KK A (B1 :: K2) /\ perm JJ KK)

adj_same_result_diff_both < search.
Proof completed.
Abella < Theorem perm_invert : 
forall A J K JJ KK, perm J K -> adj JJ A J -> adj KK A K -> perm JJ KK.


============================
 forall A J K JJ KK, perm J K -> adj JJ A J -> adj KK A K -> perm JJ KK

perm_invert < induction on 1.

IH : forall A J K JJ KK, perm J K * -> adj JJ A J -> adj KK A K -> perm JJ KK
============================
 forall A J K JJ KK, perm J K @ -> adj JJ A J -> adj KK A K -> perm JJ KK

perm_invert < intros.

Variables: A J K JJ KK
IH : forall A J K JJ KK, perm J K * -> adj JJ A J -> adj KK A K -> perm JJ KK
H1 : perm J K @
H2 : adj JJ A J
H3 : adj KK A K
============================
 perm JJ KK

perm_invert < case H1.
Subgoal 1:

Variables: A JJ KK
IH : forall A J K JJ KK, perm J K * -> adj JJ A J -> adj KK A K -> perm JJ KK
H2 : adj JJ A nil
H3 : adj KK A nil
============================
 perm JJ KK

Subgoal 2 is:
 perm JJ KK

perm_invert < case H2.
Subgoal 2:

Variables: A J K JJ KK A1 KK1 LL
IH : forall A J K JJ KK, perm J K * -> adj JJ A J -> adj KK A K -> perm JJ KK
H2 : adj JJ A J
H3 : adj KK A K
H4 : adj KK1 A1 J
H5 : adj LL A1 K
H6 : perm KK1 LL *
============================
 perm JJ KK

perm_invert < apply adj_same_result_diff to H2 H4.
Subgoal 2:

Variables: A J K JJ KK A1 KK1 LL
IH : forall A J K JJ KK, perm J K * -> adj JJ A J -> adj KK A K -> perm JJ KK
H2 : adj JJ A J
H3 : adj KK A K
H4 : adj KK1 A1 J
H5 : adj LL A1 K
H6 : perm KK1 LL *
H7 : A = A1 /\ perm JJ KK1 \/ (exists KK, adj KK A KK1)
============================
 perm JJ KK

perm_invert < case H7.
Subgoal 2.1:

Variables: J K JJ KK A1 KK1 LL
IH : forall A J K JJ KK, perm J K * -> adj JJ A J -> adj KK A K -> perm JJ KK
H2 : adj JJ A1 J
H3 : adj KK A1 K
H4 : adj KK1 A1 J
H5 : adj LL A1 K
H6 : perm KK1 LL *
H8 : perm JJ KK1
============================
 perm JJ KK

Subgoal 2.2 is:
 perm JJ KK

perm_invert < apply adj_same_result_diff to H3 H5.
Subgoal 2.1:

Variables: J K JJ KK A1 KK1 LL
IH : forall A J K JJ KK, perm J K * -> adj JJ A J -> adj KK A K -> perm JJ KK
H2 : adj JJ A1 J
H3 : adj KK A1 K
H4 : adj KK1 A1 J
H5 : adj LL A1 K
H6 : perm KK1 LL *
H8 : perm JJ KK1
H9 : A1 = A1 /\ perm KK LL \/ (exists KK1, adj KK1 A1 LL)
============================
 perm JJ KK

Subgoal 2.2 is:
 perm JJ KK

perm_invert < case H9.
Subgoal 2.1.1:

Variables: J K JJ KK A1 KK1 LL
IH : forall A J K JJ KK, perm J K * -> adj JJ A J -> adj KK A K -> perm JJ KK
H2 : adj JJ A1 J
H3 : adj KK A1 K
H4 : adj KK1 A1 J
H5 : adj LL A1 K
H6 : perm KK1 LL *
H8 : perm JJ KK1
H10 : perm KK LL
============================
 perm JJ KK

Subgoal 2.1.2 is:
 perm JJ KK

Subgoal 2.2 is:
 perm JJ KK

perm_invert < apply perm_trans to *H8 *H6.
Subgoal 2.1.1:

Variables: J K JJ KK A1 KK1 LL
IH : forall A J K JJ KK, perm J K * -> adj JJ A J -> adj KK A K -> perm JJ KK
H2 : adj JJ A1 J
H3 : adj KK A1 K
H4 : adj KK1 A1 J
H5 : adj LL A1 K
H10 : perm KK LL
H11 : perm JJ LL
============================
 perm JJ KK

Subgoal 2.1.2 is:
 perm JJ KK

Subgoal 2.2 is:
 perm JJ KK

perm_invert < apply perm_sym to *H10.
Subgoal 2.1.1:

Variables: J K JJ KK A1 KK1 LL
IH : forall A J K JJ KK, perm J K * -> adj JJ A J -> adj KK A K -> perm JJ KK
H2 : adj JJ A1 J
H3 : adj KK A1 K
H4 : adj KK1 A1 J
H5 : adj LL A1 K
H11 : perm JJ LL
H12 : perm LL KK
============================
 perm JJ KK

Subgoal 2.1.2 is:
 perm JJ KK

Subgoal 2.2 is:
 perm JJ KK

perm_invert < backchain perm_trans.
Subgoal 2.1.2:

Variables: J K JJ KK A1 KK1 LL KK2
IH : forall A J K JJ KK, perm J K * -> adj JJ A J -> adj KK A K -> perm JJ KK
H2 : adj JJ A1 J
H3 : adj KK A1 K
H4 : adj KK1 A1 J
H5 : adj LL A1 K
H6 : perm KK1 LL *
H8 : perm JJ KK1
H10 : adj KK2 A1 LL
============================
 perm JJ KK

Subgoal 2.2 is:
 perm JJ KK

perm_invert < apply adj_same_result to H3 H5.
Subgoal 2.1.2:

Variables: J K JJ KK A1 KK1 LL KK2
IH : forall A J K JJ KK, perm J K * -> adj JJ A J -> adj KK A K -> perm JJ KK
H2 : adj JJ A1 J
H3 : adj KK A1 K
H4 : adj KK1 A1 J
H5 : adj LL A1 K
H6 : perm KK1 LL *
H8 : perm JJ KK1
H10 : adj KK2 A1 LL
H11 : perm KK LL
============================
 perm JJ KK

Subgoal 2.2 is:
 perm JJ KK

perm_invert < apply perm_trans to *H8 *H6.
Subgoal 2.1.2:

Variables: J K JJ KK A1 KK1 LL KK2
IH : forall A J K JJ KK, perm J K * -> adj JJ A J -> adj KK A K -> perm JJ KK
H2 : adj JJ A1 J
H3 : adj KK A1 K
H4 : adj KK1 A1 J
H5 : adj LL A1 K
H10 : adj KK2 A1 LL
H11 : perm KK LL
H12 : perm JJ LL
============================
 perm JJ KK

Subgoal 2.2 is:
 perm JJ KK

perm_invert < apply perm_sym to *H11.
Subgoal 2.1.2:

Variables: J K JJ KK A1 KK1 LL KK2
IH : forall A J K JJ KK, perm J K * -> adj JJ A J -> adj KK A K -> perm JJ KK
H2 : adj JJ A1 J
H3 : adj KK A1 K
H4 : adj KK1 A1 J
H5 : adj LL A1 K
H10 : adj KK2 A1 LL
H12 : perm JJ LL
H13 : perm LL KK
============================
 perm JJ KK

Subgoal 2.2 is:
 perm JJ KK

perm_invert < backchain perm_trans.
Subgoal 2.2:

Variables: A J K JJ KK A1 KK1 LL KK2
IH : forall A J K JJ KK, perm J K * -> adj JJ A J -> adj KK A K -> perm JJ KK
H2 : adj JJ A J
H3 : adj KK A K
H4 : adj KK1 A1 J
H5 : adj LL A1 K
H6 : perm KK1 LL *
H8 : adj KK2 A KK1
============================
 perm JJ KK

perm_invert < apply adj_same_result_diff to H3 H5.
Subgoal 2.2:

Variables: A J K JJ KK A1 KK1 LL KK2
IH : forall A J K JJ KK, perm J K * -> adj JJ A J -> adj KK A K -> perm JJ KK
H2 : adj JJ A J
H3 : adj KK A K
H4 : adj KK1 A1 J
H5 : adj LL A1 K
H6 : perm KK1 LL *
H8 : adj KK2 A KK1
H9 : A = A1 /\ perm KK LL \/ (exists KK1, adj KK1 A LL)
============================
 perm JJ KK

perm_invert < case H9.
Subgoal 2.2.1:

Variables: J K JJ KK A1 KK1 LL KK2
IH : forall A J K JJ KK, perm J K * -> adj JJ A J -> adj KK A K -> perm JJ KK
H2 : adj JJ A1 J
H3 : adj KK A1 K
H4 : adj KK1 A1 J
H5 : adj LL A1 K
H6 : perm KK1 LL *
H8 : adj KK2 A1 KK1
H10 : perm KK LL
============================
 perm JJ KK

Subgoal 2.2.2 is:
 perm JJ KK

perm_invert < apply perm_sym to *H10.
Subgoal 2.2.1:

Variables: J K JJ KK A1 KK1 LL KK2
IH : forall A J K JJ KK, perm J K * -> adj JJ A J -> adj KK A K -> perm JJ KK
H2 : adj JJ A1 J
H3 : adj KK A1 K
H4 : adj KK1 A1 J
H5 : adj LL A1 K
H6 : perm KK1 LL *
H8 : adj KK2 A1 KK1
H11 : perm LL KK
============================
 perm JJ KK

Subgoal 2.2.2 is:
 perm JJ KK

perm_invert < apply perm_trans to *H6 *H11.
Subgoal 2.2.1:

Variables: J K JJ KK A1 KK1 LL KK2
IH : forall A J K JJ KK, perm J K * -> adj JJ A J -> adj KK A K -> perm JJ KK
H2 : adj JJ A1 J
H3 : adj KK A1 K
H4 : adj KK1 A1 J
H5 : adj LL A1 K
H8 : adj KK2 A1 KK1
H12 : perm KK1 KK
============================
 perm JJ KK

Subgoal 2.2.2 is:
 perm JJ KK

perm_invert < apply adj_same_result to H2 H4.
Subgoal 2.2.1:

Variables: J K JJ KK A1 KK1 LL KK2
IH : forall A J K JJ KK, perm J K * -> adj JJ A J -> adj KK A K -> perm JJ KK
H2 : adj JJ A1 J
H3 : adj KK A1 K
H4 : adj KK1 A1 J
H5 : adj LL A1 K
H8 : adj KK2 A1 KK1
H12 : perm KK1 KK
H13 : perm JJ KK1
============================
 perm JJ KK

Subgoal 2.2.2 is:
 perm JJ KK

perm_invert < backchain perm_trans.
Subgoal 2.2.2:

Variables: A J K JJ KK A1 KK1 LL KK2 KK3
IH : forall A J K JJ KK, perm J K * -> adj JJ A J -> adj KK A K -> perm JJ KK
H2 : adj JJ A J
H3 : adj KK A K
H4 : adj KK1 A1 J
H5 : adj LL A1 K
H6 : perm KK1 LL *
H8 : adj KK2 A KK1
H10 : adj KK3 A LL
============================
 perm JJ KK

perm_invert < apply IH to H6 H8 H10.
Subgoal 2.2.2:

Variables: A J K JJ KK A1 KK1 LL KK2 KK3
IH : forall A J K JJ KK, perm J K * -> adj JJ A J -> adj KK A K -> perm JJ KK
H2 : adj JJ A J
H3 : adj KK A K
H4 : adj KK1 A1 J
H5 : adj LL A1 K
H6 : perm KK1 LL *
H8 : adj KK2 A KK1
H10 : adj KK3 A LL
H11 : perm KK2 KK3
============================
 perm JJ KK

perm_invert < apply adj_swap to *H10 *H5.
Subgoal 2.2.2:

Variables: A J K JJ KK A1 KK1 LL KK2 KK3 U
IH : forall A J K JJ KK, perm J K * -> adj JJ A J -> adj KK A K -> perm JJ KK
H2 : adj JJ A J
H3 : adj KK A K
H4 : adj KK1 A1 J
H6 : perm KK1 LL *
H8 : adj KK2 A KK1
H11 : perm KK2 KK3
H12 : adj KK3 A1 U
H13 : adj U A K
============================
 perm JJ KK

perm_invert < apply adj_swap to *H8 *H4.
Subgoal 2.2.2:

Variables: A J K JJ KK A1 KK1 LL KK2 KK3 U U1
IH : forall A J K JJ KK, perm J K * -> adj JJ A J -> adj KK A K -> perm JJ KK
H2 : adj JJ A J
H3 : adj KK A K
H6 : perm KK1 LL *
H11 : perm KK2 KK3
H12 : adj KK3 A1 U
H13 : adj U A K
H14 : adj KK2 A1 U1
H15 : adj U1 A J
============================
 perm JJ KK

perm_invert < apply adj_same_result to *H2 *H15.
Subgoal 2.2.2:

Variables: A J K JJ KK A1 KK1 LL KK2 KK3 U U1
IH : forall A J K JJ KK, perm J K * -> adj JJ A J -> adj KK A K -> perm JJ KK
H3 : adj KK A K
H6 : perm KK1 LL *
H11 : perm KK2 KK3
H12 : adj KK3 A1 U
H13 : adj U A K
H14 : adj KK2 A1 U1
H16 : perm JJ U1
============================
 perm JJ KK

perm_invert < apply adj_same_result to *H13 *H3.
Subgoal 2.2.2:

Variables: A J K JJ KK A1 KK1 LL KK2 KK3 U U1
IH : forall A J K JJ KK, perm J K * -> adj JJ A J -> adj KK A K -> perm JJ KK
H6 : perm KK1 LL *
H11 : perm KK2 KK3
H12 : adj KK3 A1 U
H14 : adj KK2 A1 U1
H16 : perm JJ U1
H17 : perm U KK
============================
 perm JJ KK

perm_invert < apply adj_preserves_perm to *H14 *H12 *H11.
Subgoal 2.2.2:

Variables: A J K JJ KK A1 KK1 LL KK2 KK3 U U1
IH : forall A J K JJ KK, perm J K * -> adj JJ A J -> adj KK A K -> perm JJ KK
H6 : perm KK1 LL *
H16 : perm JJ U1
H17 : perm U KK
H18 : perm U1 U
============================
 perm JJ KK

perm_invert < apply perm_trans to *H16 *H18.
Subgoal 2.2.2:

Variables: A J K JJ KK A1 KK1 LL KK2 KK3 U U1
IH : forall A J K JJ KK, perm J K * -> adj JJ A J -> adj KK A K -> perm JJ KK
H6 : perm KK1 LL *
H17 : perm U KK
H19 : perm JJ U
============================
 perm JJ KK

perm_invert < backchain perm_trans.
Proof completed.
Abella < Theorem adj_perm_result : 
forall J K A JJ, perm J K -> adj JJ A J ->
  (exists KK, adj KK A K /\ perm JJ KK).


============================
 forall J K A JJ, perm J K -> adj JJ A J ->
   (exists KK, adj KK A K /\ perm JJ KK)

adj_perm_result < induction on 1.

IH : forall J K A JJ, perm J K * -> adj JJ A J ->
       (exists KK, adj KK A K /\ perm JJ KK)
============================
 forall J K A JJ, perm J K @ -> adj JJ A J ->
   (exists KK, adj KK A K /\ perm JJ KK)

adj_perm_result < intros.

Variables: J K A JJ
IH : forall J K A JJ, perm J K * -> adj JJ A J ->
       (exists KK, adj KK A K /\ perm JJ KK)
H1 : perm J K @
H2 : adj JJ A J
============================
 exists KK, adj KK A K /\ perm JJ KK

adj_perm_result < case H1.
Subgoal 1:

Variables: A JJ
IH : forall J K A JJ, perm J K * -> adj JJ A J ->
       (exists KK, adj KK A K /\ perm JJ KK)
H2 : adj JJ A nil
============================
 exists KK, adj KK A nil /\ perm JJ KK

Subgoal 2 is:
 exists KK, adj KK A K /\ perm JJ KK

adj_perm_result < case H2.
Subgoal 2:

Variables: J K A JJ A1 KK LL
IH : forall J K A JJ, perm J K * -> adj JJ A J ->
       (exists KK, adj KK A K /\ perm JJ KK)
H2 : adj JJ A J
H3 : adj KK A1 J
H4 : adj LL A1 K
H5 : perm KK LL *
============================
 exists KK, adj KK A K /\ perm JJ KK

adj_perm_result < apply adj_same_result_diff to H2 H3.
Subgoal 2:

Variables: J K A JJ A1 KK LL
IH : forall J K A JJ, perm J K * -> adj JJ A J ->
       (exists KK, adj KK A K /\ perm JJ KK)
H2 : adj JJ A J
H3 : adj KK A1 J
H4 : adj LL A1 K
H5 : perm KK LL *
H6 : A = A1 /\ perm JJ KK \/ (exists KK1, adj KK1 A KK)
============================
 exists KK, adj KK A K /\ perm JJ KK

adj_perm_result < case H6.
Subgoal 2.1:

Variables: J K JJ A1 KK LL
IH : forall J K A JJ, perm J K * -> adj JJ A J ->
       (exists KK, adj KK A K /\ perm JJ KK)
H2 : adj JJ A1 J
H3 : adj KK A1 J
H4 : adj LL A1 K
H5 : perm KK LL *
H7 : perm JJ KK
============================
 exists KK, adj KK A1 K /\ perm JJ KK

Subgoal 2.2 is:
 exists KK, adj KK A K /\ perm JJ KK

adj_perm_result < apply perm_trans to H7 H5.
Subgoal 2.1:

Variables: J K JJ A1 KK LL
IH : forall J K A JJ, perm J K * -> adj JJ A J ->
       (exists KK, adj KK A K /\ perm JJ KK)
H2 : adj JJ A1 J
H3 : adj KK A1 J
H4 : adj LL A1 K
H5 : perm KK LL *
H7 : perm JJ KK
H8 : perm JJ LL
============================
 exists KK, adj KK A1 K /\ perm JJ KK

Subgoal 2.2 is:
 exists KK, adj KK A K /\ perm JJ KK

adj_perm_result < search.
Subgoal 2.2:

Variables: J K A JJ A1 KK LL KK1
IH : forall J K A JJ, perm J K * -> adj JJ A J ->
       (exists KK, adj KK A K /\ perm JJ KK)
H2 : adj JJ A J
H3 : adj KK A1 J
H4 : adj LL A1 K
H5 : perm KK LL *
H7 : adj KK1 A KK
============================
 exists KK, adj KK A K /\ perm JJ KK

adj_perm_result < apply IH to H5 H7.
Subgoal 2.2:

Variables: J K A JJ A1 KK LL KK1 KK2
IH : forall J K A JJ, perm J K * -> adj JJ A J ->
       (exists KK, adj KK A K /\ perm JJ KK)
H2 : adj JJ A J
H3 : adj KK A1 J
H4 : adj LL A1 K
H5 : perm KK LL *
H7 : adj KK1 A KK
H8 : adj KK2 A LL
H9 : perm KK1 KK2
============================
 exists KK, adj KK A K /\ perm JJ KK

adj_perm_result < apply adj_swap to H7 H3.
Subgoal 2.2:

Variables: J K A JJ A1 KK LL KK1 KK2 U
IH : forall J K A JJ, perm J K * -> adj JJ A J ->
       (exists KK, adj KK A K /\ perm JJ KK)
H2 : adj JJ A J
H3 : adj KK A1 J
H4 : adj LL A1 K
H5 : perm KK LL *
H7 : adj KK1 A KK
H8 : adj KK2 A LL
H9 : perm KK1 KK2
H10 : adj KK1 A1 U
H11 : adj U A J
============================
 exists KK, adj KK A K /\ perm JJ KK

adj_perm_result < apply adj_swap to H8 H4.
Subgoal 2.2:

Variables: J K A JJ A1 KK LL KK1 KK2 U U1
IH : forall J K A JJ, perm J K * -> adj JJ A J ->
       (exists KK, adj KK A K /\ perm JJ KK)
H2 : adj JJ A J
H3 : adj KK A1 J
H4 : adj LL A1 K
H5 : perm KK LL *
H7 : adj KK1 A KK
H8 : adj KK2 A LL
H9 : perm KK1 KK2
H10 : adj KK1 A1 U
H11 : adj U A J
H12 : adj KK2 A1 U1
H13 : adj U1 A K
============================
 exists KK, adj KK A K /\ perm JJ KK

adj_perm_result < witness U1.
Subgoal 2.2:

Variables: J K A JJ A1 KK LL KK1 KK2 U U1
IH : forall J K A JJ, perm J K * -> adj JJ A J ->
       (exists KK, adj KK A K /\ perm JJ KK)
H2 : adj JJ A J
H3 : adj KK A1 J
H4 : adj LL A1 K
H5 : perm KK LL *
H7 : adj KK1 A KK
H8 : adj KK2 A LL
H9 : perm KK1 KK2
H10 : adj KK1 A1 U
H11 : adj U A J
H12 : adj KK2 A1 U1
H13 : adj U1 A K
============================
 adj U1 A K /\ perm JJ U1

adj_perm_result < split.
Subgoal 2.2.1:

Variables: J K A JJ A1 KK LL KK1 KK2 U U1
IH : forall J K A JJ, perm J K * -> adj JJ A J ->
       (exists KK, adj KK A K /\ perm JJ KK)
H2 : adj JJ A J
H3 : adj KK A1 J
H4 : adj LL A1 K
H5 : perm KK LL *
H7 : adj KK1 A KK
H8 : adj KK2 A LL
H9 : perm KK1 KK2
H10 : adj KK1 A1 U
H11 : adj U A J
H12 : adj KK2 A1 U1
H13 : adj U1 A K
============================
 adj U1 A K

Subgoal 2.2.2 is:
 perm JJ U1

adj_perm_result < search.
Subgoal 2.2.2:

Variables: J K A JJ A1 KK LL KK1 KK2 U U1
IH : forall J K A JJ, perm J K * -> adj JJ A J ->
       (exists KK, adj KK A K /\ perm JJ KK)
H2 : adj JJ A J
H3 : adj KK A1 J
H4 : adj LL A1 K
H5 : perm KK LL *
H7 : adj KK1 A KK
H8 : adj KK2 A LL
H9 : perm KK1 KK2
H10 : adj KK1 A1 U
H11 : adj U A J
H12 : adj KK2 A1 U1
H13 : adj U1 A K
============================
 perm JJ U1

adj_perm_result < apply adj_same_result to H2 H11.
Subgoal 2.2.2:

Variables: J K A JJ A1 KK LL KK1 KK2 U U1
IH : forall J K A JJ, perm J K * -> adj JJ A J ->
       (exists KK, adj KK A K /\ perm JJ KK)
H2 : adj JJ A J
H3 : adj KK A1 J
H4 : adj LL A1 K
H5 : perm KK LL *
H7 : adj KK1 A KK
H8 : adj KK2 A LL
H9 : perm KK1 KK2
H10 : adj KK1 A1 U
H11 : adj U A J
H12 : adj KK2 A1 U1
H13 : adj U1 A K
H14 : perm JJ U
============================
 perm JJ U1

adj_perm_result < apply adj_preserves_perm to H10 H12 H9.
Subgoal 2.2.2:

Variables: J K A JJ A1 KK LL KK1 KK2 U U1
IH : forall J K A JJ, perm J K * -> adj JJ A J ->
       (exists KK, adj KK A K /\ perm JJ KK)
H2 : adj JJ A J
H3 : adj KK A1 J
H4 : adj LL A1 K
H5 : perm KK LL *
H7 : adj KK1 A KK
H8 : adj KK2 A LL
H9 : perm KK1 KK2
H10 : adj KK1 A1 U
H11 : adj U A J
H12 : adj KK2 A1 U1
H13 : adj U1 A K
H14 : perm JJ U
H15 : perm U U1
============================
 perm JJ U1

adj_perm_result < backchain perm_trans.
Proof completed.
Abella < Theorem adj_perm_source : 
forall J K A L, perm J K -> adj J A L -> (exists LL, adj K A LL /\ perm L LL).


============================
 forall J K A L, perm J K -> adj J A L ->
   (exists LL, adj K A LL /\ perm L LL)

adj_perm_source < intros.

Variables: J K A L
H1 : perm J K
H2 : adj J A L
============================
 exists LL, adj K A LL /\ perm L LL

adj_perm_source < apply adj_2_is_o to H2.

Variables: J K A L
H1 : perm J K
H2 : adj J A L
H3 : is_o A
============================
 exists LL, adj K A LL /\ perm L LL

adj_perm_source < apply perm_2_is_list to H1.

Variables: J K A L
H1 : perm J K
H2 : adj J A L
H3 : is_o A
H4 : is_list K
============================
 exists LL, adj K A LL /\ perm L LL

adj_perm_source < apply adj_exists to H3 H4.

Variables: J K A L M
H1 : perm J K
H2 : adj J A L
H3 : is_o A
H4 : is_list K
H5 : adj K A M
============================
 exists LL, adj K A LL /\ perm L LL

adj_perm_source < search.
Proof completed.
Abella < Theorem adj_nil_1 : 
forall A L, adj nil A L -> L = A :: nil.


============================
 forall A L, adj nil A L -> L = A :: nil

adj_nil_1 < intros.

Variables: A L
H1 : adj nil A L
============================
 L = A :: nil

adj_nil_1 < case H1.

Variables: A
H2 : is_o A
H3 : is_list nil
============================
 A :: nil = A :: nil

adj_nil_1 < search.
Proof completed.
Abella < Theorem perm_nil_1 : 
forall L, perm nil L -> L = nil.


============================
 forall L, perm nil L -> L = nil

perm_nil_1 < intros.

Variables: L
H1 : perm nil L
============================
 L = nil

perm_nil_1 < case H1.
Subgoal 1:

============================
 nil = nil

Subgoal 2 is:
 L = nil

perm_nil_1 < search.
Subgoal 2:

Variables: L A KK LL
H2 : adj KK A nil
H3 : adj LL A L
H4 : perm KK LL
============================
 L = nil

perm_nil_1 < case H2.
Proof completed.
Abella < Theorem adj_det : 
forall A B L, adj L A (B :: nil) -> A = B /\ L = nil.


============================
 forall A B L, adj L A (B :: nil) -> A = B /\ L = nil

adj_det < intros.

Variables: A B L
H1 : adj L A (B :: nil)
============================
 A = B /\ L = nil

adj_det < case H1.
Subgoal 1:

Variables: B
H2 : is_o B
H3 : is_list nil
============================
 B = B /\ nil = nil

Subgoal 2 is:
 A = B /\ B :: K = nil

adj_det < search.
Subgoal 2:

Variables: A B K
H2 : is_o B
H3 : adj K A nil
============================
 A = B /\ B :: K = nil

adj_det < case H3.
Proof completed.
Abella < Theorem perm_singleton : 
forall A L, perm (A :: nil) L -> L = A :: nil.


============================
 forall A L, perm (A :: nil) L -> L = A :: nil

perm_singleton < intros.

Variables: A L
H1 : perm (A :: nil) L
============================
 L = A :: nil

perm_singleton < case H1.

Variables: A L A1 KK LL
H2 : adj KK A1 (A :: nil)
H3 : adj LL A1 L
H4 : perm KK LL
============================
 L = A :: nil

perm_singleton < apply adj_det to H2.

Variables: A L LL
H2 : adj nil A (A :: nil)
H3 : adj LL A L
H4 : perm nil LL
============================
 L = A :: nil

perm_singleton < apply perm_nil_1 to H4.

Variables: A L
H2 : adj nil A (A :: nil)
H3 : adj nil A L
H4 : perm nil nil
============================
 L = A :: nil

perm_singleton < apply adj_nil_1 to H3.

Variables: A
H2 : adj nil A (A :: nil)
H3 : adj nil A (A :: nil)
H4 : perm nil nil
============================
 A :: nil = A :: nil

perm_singleton < search.
Proof completed.
Abella < Theorem append_perm : 
forall J K L JJ KK, append J K L -> perm J JJ -> perm K KK ->
  (exists LL, append JJ KK LL /\ perm L LL).


============================
 forall J K L JJ KK, append J K L -> perm J JJ -> perm K KK ->
   (exists LL, append JJ KK LL /\ perm L LL)

append_perm < induction on 1.

IH : forall J K L JJ KK, append J K L * -> perm J JJ -> perm K KK ->
       (exists LL, append JJ KK LL /\ perm L LL)
============================
 forall J K L JJ KK, append J K L @ -> perm J JJ -> perm K KK ->
   (exists LL, append JJ KK LL /\ perm L LL)

append_perm < intros.

Variables: J K L JJ KK
IH : forall J K L JJ KK, append J K L * -> perm J JJ -> perm K KK ->
       (exists LL, append JJ KK LL /\ perm L LL)
H1 : append J K L @
H2 : perm J JJ
H3 : perm K KK
============================
 exists LL, append JJ KK LL /\ perm L LL

append_perm < case H1.
Subgoal 1:

Variables: L JJ KK
IH : forall J K L JJ KK, append J K L * -> perm J JJ -> perm K KK ->
       (exists LL, append JJ KK LL /\ perm L LL)
H2 : perm nil JJ
H3 : perm L KK
H4 : is_list L
============================
 exists LL, append JJ KK LL /\ perm L LL

Subgoal 2 is:
 exists LL, append JJ KK LL /\ perm (A :: L1) LL

append_perm < case H2.
Subgoal 1.1:

Variables: L KK
IH : forall J K L JJ KK, append J K L * -> perm J JJ -> perm K KK ->
       (exists LL, append JJ KK LL /\ perm L LL)
H3 : perm L KK
H4 : is_list L
============================
 exists LL, append nil KK LL /\ perm L LL

Subgoal 1.2 is:
 exists LL, append JJ KK LL /\ perm L LL

Subgoal 2 is:
 exists LL, append JJ KK LL /\ perm (A :: L1) LL

append_perm < apply perm_2_is_list to H3.
Subgoal 1.1:

Variables: L KK
IH : forall J K L JJ KK, append J K L * -> perm J JJ -> perm K KK ->
       (exists LL, append JJ KK LL /\ perm L LL)
H3 : perm L KK
H4 : is_list L
H5 : is_list KK
============================
 exists LL, append nil KK LL /\ perm L LL

Subgoal 1.2 is:
 exists LL, append JJ KK LL /\ perm L LL

Subgoal 2 is:
 exists LL, append JJ KK LL /\ perm (A :: L1) LL

append_perm < search.
Subgoal 1.2:

Variables: L JJ KK A KK1 LL
IH : forall J K L JJ KK, append J K L * -> perm J JJ -> perm K KK ->
       (exists LL, append JJ KK LL /\ perm L LL)
H3 : perm L KK
H4 : is_list L
H5 : adj KK1 A nil
H6 : adj LL A JJ
H7 : perm KK1 LL
============================
 exists LL, append JJ KK LL /\ perm L LL

Subgoal 2 is:
 exists LL, append JJ KK LL /\ perm (A :: L1) LL

append_perm < case H5.
Subgoal 2:

Variables: K JJ KK L1 A J1
IH : forall J K L JJ KK, append J K L * -> perm J JJ -> perm K KK ->
       (exists LL, append JJ KK LL /\ perm L LL)
H2 : perm (A :: J1) JJ
H3 : perm K KK
H4 : is_o A
H5 : append J1 K L1 *
============================
 exists LL, append JJ KK LL /\ perm (A :: L1) LL

append_perm < apply perm_cons_1 to *H2.
Subgoal 2:

Variables: K JJ KK L1 A J1 J2
IH : forall J K L JJ KK, append J K L * -> perm J JJ -> perm K KK ->
       (exists LL, append JJ KK LL /\ perm L LL)
H3 : perm K KK
H4 : is_o A
H5 : append J1 K L1 *
H6 : adj J2 A JJ
H7 : perm J1 J2
============================
 exists LL, append JJ KK LL /\ perm (A :: L1) LL

append_perm < apply IH to H5 H7 H3.
Subgoal 2:

Variables: K JJ KK L1 A J1 J2 LL
IH : forall J K L JJ KK, append J K L * -> perm J JJ -> perm K KK ->
       (exists LL, append JJ KK LL /\ perm L LL)
H3 : perm K KK
H4 : is_o A
H5 : append J1 K L1 *
H6 : adj J2 A JJ
H7 : perm J1 J2
H8 : append J2 KK LL
H9 : perm L1 LL
============================
 exists LL, append JJ KK LL /\ perm (A :: L1) LL

append_perm < apply adj_1_append to H6 H8.
Subgoal 2:

Variables: K JJ KK L1 A J1 J2 LL KL
IH : forall J K L JJ KK, append J K L * -> perm J JJ -> perm K KK ->
       (exists LL, append JJ KK LL /\ perm L LL)
H3 : perm K KK
H4 : is_o A
H5 : append J1 K L1 *
H6 : adj J2 A JJ
H7 : perm J1 J2
H8 : append J2 KK LL
H9 : perm L1 LL
H10 : append JJ KK KL
H11 : adj LL A KL
============================
 exists LL, append JJ KK LL /\ perm (A :: L1) LL

append_perm < apply adj_3_is_list to H11.
Subgoal 2:

Variables: K JJ KK L1 A J1 J2 LL KL
IH : forall J K L JJ KK, append J K L * -> perm J JJ -> perm K KK ->
       (exists LL, append JJ KK LL /\ perm L LL)
H3 : perm K KK
H4 : is_o A
H5 : append J1 K L1 *
H6 : adj J2 A JJ
H7 : perm J1 J2
H8 : append J2 KK LL
H9 : perm L1 LL
H10 : append JJ KK KL
H11 : adj LL A KL
H12 : is_list KL
============================
 exists LL, append JJ KK LL /\ perm (A :: L1) LL

append_perm < apply perm_1_is_list to H9.
Subgoal 2:

Variables: K JJ KK L1 A J1 J2 LL KL
IH : forall J K L JJ KK, append J K L * -> perm J JJ -> perm K KK ->
       (exists LL, append JJ KK LL /\ perm L LL)
H3 : perm K KK
H4 : is_o A
H5 : append J1 K L1 *
H6 : adj J2 A JJ
H7 : perm J1 J2
H8 : append J2 KK LL
H9 : perm L1 LL
H10 : append JJ KK KL
H11 : adj LL A KL
H12 : is_list KL
H13 : is_list L1
============================
 exists LL, append JJ KK LL /\ perm (A :: L1) LL

append_perm < search.
Proof completed.
Abella < Theorem adj_perm : 
forall J K JJ A, perm J K -> adj JJ A J -> (exists KK, adj KK A K).


============================
 forall J K JJ A, perm J K -> adj JJ A J -> (exists KK, adj KK A K)

adj_perm < induction on 2.

IH : forall J K JJ A, perm J K -> adj JJ A J * -> (exists KK, adj KK A K)
============================
 forall J K JJ A, perm J K -> adj JJ A J @ -> (exists KK, adj KK A K)

adj_perm < intros.

Variables: J K JJ A
IH : forall J K JJ A, perm J K -> adj JJ A J * -> (exists KK, adj KK A K)
H1 : perm J K
H2 : adj JJ A J @
============================
 exists KK, adj KK A K

adj_perm < case H2.
Subgoal 1:

Variables: K JJ A
IH : forall J K JJ A, perm J K -> adj JJ A J * -> (exists KK, adj KK A K)
H1 : perm (A :: JJ) K
H3 : is_o A
H4 : is_list JJ
============================
 exists KK, adj KK A K

Subgoal 2 is:
 exists KK, adj KK A K

adj_perm < apply perm_cons_1 to *H1.
Subgoal 1:

Variables: K JJ A J1
IH : forall J K JJ A, perm J K -> adj JJ A J * -> (exists KK, adj KK A K)
H3 : is_o A
H4 : is_list JJ
H5 : adj J1 A K
H6 : perm JJ J1
============================
 exists KK, adj KK A K

Subgoal 2 is:
 exists KK, adj KK A K

adj_perm < search.
Subgoal 2:

Variables: K A L B K1
IH : forall J K JJ A, perm J K -> adj JJ A J * -> (exists KK, adj KK A K)
H1 : perm (B :: L) K
H3 : is_o B
H4 : adj K1 A L *
============================
 exists KK, adj KK A K

adj_perm < apply perm_cons_1 to *H1.
Subgoal 2:

Variables: K A L B K1 J1
IH : forall J K JJ A, perm J K -> adj JJ A J * -> (exists KK, adj KK A K)
H3 : is_o B
H4 : adj K1 A L *
H5 : adj J1 B K
H6 : perm L J1
============================
 exists KK, adj KK A K

adj_perm < apply IH to H6 H4.
Subgoal 2:

Variables: K A L B K1 J1 KK
IH : forall J K JJ A, perm J K -> adj JJ A J * -> (exists KK, adj KK A K)
H3 : is_o B
H4 : adj K1 A L *
H5 : adj J1 B K
H6 : perm L J1
H7 : adj KK A J1
============================
 exists KK, adj KK A K

adj_perm < apply adj_swap to H7 H5.
Subgoal 2:

Variables: K A L B K1 J1 KK U
IH : forall J K JJ A, perm J K -> adj JJ A J * -> (exists KK, adj KK A K)
H3 : is_o B
H4 : adj K1 A L *
H5 : adj J1 B K
H6 : perm L J1
H7 : adj KK A J1
H8 : adj KK B U
H9 : adj U A K
============================
 exists KK, adj KK A K

adj_perm < search.
Proof completed.
Abella < Theorem adj_perm_full : 
forall J K JJ A, perm J K -> adj JJ A J ->
  (exists KK, adj KK A K /\ perm JJ KK).


============================
 forall J K JJ A, perm J K -> adj JJ A J ->
   (exists KK, adj KK A K /\ perm JJ KK)

adj_perm_full < induction on 2.

IH : forall J K JJ A, perm J K -> adj JJ A J * ->
       (exists KK, adj KK A K /\ perm JJ KK)
============================
 forall J K JJ A, perm J K -> adj JJ A J @ ->
   (exists KK, adj KK A K /\ perm JJ KK)

adj_perm_full < intros.

Variables: J K JJ A
IH : forall J K JJ A, perm J K -> adj JJ A J * ->
       (exists KK, adj KK A K /\ perm JJ KK)
H1 : perm J K
H2 : adj JJ A J @
============================
 exists KK, adj KK A K /\ perm JJ KK

adj_perm_full < case H2.
Subgoal 1:

Variables: K JJ A
IH : forall J K JJ A, perm J K -> adj JJ A J * ->
       (exists KK, adj KK A K /\ perm JJ KK)
H1 : perm (A :: JJ) K
H3 : is_o A
H4 : is_list JJ
============================
 exists KK, adj KK A K /\ perm JJ KK

Subgoal 2 is:
 exists KK, adj KK A K /\ perm (B :: K1) KK

adj_perm_full < apply perm_cons_1 to *H1.
Subgoal 1:

Variables: K JJ A J1
IH : forall J K JJ A, perm J K -> adj JJ A J * ->
       (exists KK, adj KK A K /\ perm JJ KK)
H3 : is_o A
H4 : is_list JJ
H5 : adj J1 A K
H6 : perm JJ J1
============================
 exists KK, adj KK A K /\ perm JJ KK

Subgoal 2 is:
 exists KK, adj KK A K /\ perm (B :: K1) KK

adj_perm_full < search.
Subgoal 2:

Variables: K A L B K1
IH : forall J K JJ A, perm J K -> adj JJ A J * ->
       (exists KK, adj KK A K /\ perm JJ KK)
H1 : perm (B :: L) K
H3 : is_o B
H4 : adj K1 A L *
============================
 exists KK, adj KK A K /\ perm (B :: K1) KK

adj_perm_full < apply perm_cons_1 to *H1.
Subgoal 2:

Variables: K A L B K1 J1
IH : forall J K JJ A, perm J K -> adj JJ A J * ->
       (exists KK, adj KK A K /\ perm JJ KK)
H3 : is_o B
H4 : adj K1 A L *
H5 : adj J1 B K
H6 : perm L J1
============================
 exists KK, adj KK A K /\ perm (B :: K1) KK

adj_perm_full < apply IH to H6 H4.
Subgoal 2:

Variables: K A L B K1 J1 KK
IH : forall J K JJ A, perm J K -> adj JJ A J * ->
       (exists KK, adj KK A K /\ perm JJ KK)
H3 : is_o B
H4 : adj K1 A L *
H5 : adj J1 B K
H6 : perm L J1
H7 : adj KK A J1
H8 : perm K1 KK
============================
 exists KK, adj KK A K /\ perm (B :: K1) KK

adj_perm_full < apply adj_swap to H7 H5.
Subgoal 2:

Variables: K A L B K1 J1 KK U
IH : forall J K JJ A, perm J K -> adj JJ A J * ->
       (exists KK, adj KK A K /\ perm JJ KK)
H3 : is_o B
H4 : adj K1 A L *
H5 : adj J1 B K
H6 : perm L J1
H7 : adj KK A J1
H8 : perm K1 KK
H9 : adj KK B U
H10 : adj U A K
============================
 exists KK, adj KK A K /\ perm (B :: K1) KK

adj_perm_full < apply adj_1_is_list to H4.
Subgoal 2:

Variables: K A L B K1 J1 KK U
IH : forall J K JJ A, perm J K -> adj JJ A J * ->
       (exists KK, adj KK A K /\ perm JJ KK)
H3 : is_o B
H4 : adj K1 A L *
H5 : adj J1 B K
H6 : perm L J1
H7 : adj KK A J1
H8 : perm K1 KK
H9 : adj KK B U
H10 : adj U A K
H11 : is_list K1
============================
 exists KK, adj KK A K /\ perm (B :: K1) KK

adj_perm_full < search.
Proof completed.
Abella < Theorem adj_member : 
forall J A L, adj J A L -> member A L.


============================
 forall J A L, adj J A L -> member A L

adj_member < induction on 1.

IH : forall J A L, adj J A L * -> member A L
============================
 forall J A L, adj J A L @ -> member A L

adj_member < intros.

Variables: J A L
IH : forall J A L, adj J A L * -> member A L
H1 : adj J A L @
============================
 member A L

adj_member < case H1.
Subgoal 1:

Variables: J A
IH : forall J A L, adj J A L * -> member A L
H2 : is_o A
H3 : is_list J
============================
 member A (A :: J)

Subgoal 2 is:
 member A (B :: L1)

adj_member < search.
Subgoal 2:

Variables: A L1 B K
IH : forall J A L, adj J A L * -> member A L
H2 : is_o B
H3 : adj K A L1 *
============================
 member A (B :: L1)

adj_member < apply IH to H3.
Subgoal 2:

Variables: A L1 B K
IH : forall J A L, adj J A L * -> member A L
H2 : is_o B
H3 : adj K A L1 *
H4 : member A L1
============================
 member A (B :: L1)

adj_member < search.
Proof completed.
Abella < Theorem member_adj : 
forall A L, is_list L -> member A L -> (exists J, adj J A L).


============================
 forall A L, is_list L -> member A L -> (exists J, adj J A L)

member_adj < induction on 2.

IH : forall A L, is_list L -> member A L * -> (exists J, adj J A L)
============================
 forall A L, is_list L -> member A L @ -> (exists J, adj J A L)

member_adj < intros.

Variables: A L
IH : forall A L, is_list L -> member A L * -> (exists J, adj J A L)
H1 : is_list L
H2 : member A L @
============================
 exists J, adj J A L

member_adj < case H2.
Subgoal 1:

Variables: A L1
IH : forall A L, is_list L -> member A L * -> (exists J, adj J A L)
H1 : is_list (A :: L1)
============================
 exists J, adj J A (A :: L1)

Subgoal 2 is:
 exists J, adj J A (B :: L1)

member_adj < case H1.
Subgoal 1:

Variables: A L1
IH : forall A L, is_list L -> member A L * -> (exists J, adj J A L)
H3 : is_o A
H4 : is_list L1
============================
 exists J, adj J A (A :: L1)

Subgoal 2 is:
 exists J, adj J A (B :: L1)

member_adj < search.
Subgoal 2:

Variables: A L1 B
IH : forall A L, is_list L -> member A L * -> (exists J, adj J A L)
H1 : is_list (B :: L1)
H3 : member A L1 *
============================
 exists J, adj J A (B :: L1)

member_adj < case H1.
Subgoal 2:

Variables: A L1 B
IH : forall A L, is_list L -> member A L * -> (exists J, adj J A L)
H3 : member A L1 *
H4 : is_o B
H5 : is_list L1
============================
 exists J, adj J A (B :: L1)

member_adj < apply IH to *H5 *H3.
Subgoal 2:

Variables: A L1 B J
IH : forall A L, is_list L -> member A L * -> (exists J, adj J A L)
H4 : is_o B
H6 : adj J A L1
============================
 exists J, adj J A (B :: L1)

member_adj < search.
Proof completed.
Abella < Theorem member_adj_rel : 
forall JJ A J B, adj JJ A J -> member B J -> A = B \/ member B JJ.


============================
 forall JJ A J B, adj JJ A J -> member B J -> A = B \/ member B JJ

member_adj_rel < induction on 1.

IH : forall JJ A J B, adj JJ A J * -> member B J -> A = B \/ member B JJ
============================
 forall JJ A J B, adj JJ A J @ -> member B J -> A = B \/ member B JJ

member_adj_rel < intros.

Variables: JJ A J B
IH : forall JJ A J B, adj JJ A J * -> member B J -> A = B \/ member B JJ
H1 : adj JJ A J @
H2 : member B J
============================
 A = B \/ member B JJ

member_adj_rel < case H1.
Subgoal 1:

Variables: JJ A B
IH : forall JJ A J B, adj JJ A J * -> member B J -> A = B \/ member B JJ
H2 : member B (A :: JJ)
H3 : is_o A
H4 : is_list JJ
============================
 A = B \/ member B JJ

Subgoal 2 is:
 A = B \/ member B (B1 :: K)

member_adj_rel < case H2.
Subgoal 1.1:

Variables: JJ A
IH : forall JJ A J B, adj JJ A J * -> member B J -> A = B \/ member B JJ
H3 : is_o A
H4 : is_list JJ
============================
 A = A \/ member A JJ

Subgoal 1.2 is:
 A = B \/ member B JJ

Subgoal 2 is:
 A = B \/ member B (B1 :: K)

member_adj_rel < search.
Subgoal 1.2:

Variables: JJ A B
IH : forall JJ A J B, adj JJ A J * -> member B J -> A = B \/ member B JJ
H3 : is_o A
H4 : is_list JJ
H5 : member B JJ
============================
 A = B \/ member B JJ

Subgoal 2 is:
 A = B \/ member B (B1 :: K)

member_adj_rel < search.
Subgoal 2:

Variables: A B L B1 K
IH : forall JJ A J B, adj JJ A J * -> member B J -> A = B \/ member B JJ
H2 : member B (B1 :: L)
H3 : is_o B1
H4 : adj K A L *
============================
 A = B \/ member B (B1 :: K)

member_adj_rel < case H2.
Subgoal 2.1:

Variables: A L B1 K
IH : forall JJ A J B, adj JJ A J * -> member B J -> A = B \/ member B JJ
H3 : is_o B1
H4 : adj K A L *
============================
 A = B1 \/ member B1 (B1 :: K)

Subgoal 2.2 is:
 A = B \/ member B (B1 :: K)

member_adj_rel < search.
Subgoal 2.2:

Variables: A B L B1 K
IH : forall JJ A J B, adj JJ A J * -> member B J -> A = B \/ member B JJ
H3 : is_o B1
H4 : adj K A L *
H5 : member B L
============================
 A = B \/ member B (B1 :: K)

member_adj_rel < apply IH to *H4 H5.
Subgoal 2.2:

Variables: A B L B1 K
IH : forall JJ A J B, adj JJ A J * -> member B J -> A = B \/ member B JJ
H3 : is_o B1
H5 : member B L
H6 : A = B \/ member B K
============================
 A = B \/ member B (B1 :: K)

member_adj_rel < case H6.
Subgoal 2.2.1:

Variables: B L B1 K
IH : forall JJ A J B, adj JJ A J * -> member B J -> A = B \/ member B JJ
H3 : is_o B1
H5 : member B L
============================
 B = B \/ member B (B1 :: K)

Subgoal 2.2.2 is:
 A = B \/ member B (B1 :: K)

member_adj_rel < search.
Subgoal 2.2.2:

Variables: A B L B1 K
IH : forall JJ A J B, adj JJ A J * -> member B J -> A = B \/ member B JJ
H3 : is_o B1
H5 : member B L
H7 : member B K
============================
 A = B \/ member B (B1 :: K)

member_adj_rel < search.
Proof completed.
Abella < Theorem adj_preserves_member_lem : 
forall A J B L, is_list J -> member A J -> adj J B L -> member A L.


============================
 forall A J B L, is_list J -> member A J -> adj J B L -> member A L

adj_preserves_member_lem < induction on 2.

IH : forall A J B L, is_list J -> member A J * -> adj J B L -> member A L
============================
 forall A J B L, is_list J -> member A J @ -> adj J B L -> member A L

adj_preserves_member_lem < intros.

Variables: A J B L
IH : forall A J B L, is_list J -> member A J * -> adj J B L -> member A L
H1 : is_list J
H2 : member A J @
H3 : adj J B L
============================
 member A L

adj_preserves_member_lem < case H2.
Subgoal 1:

Variables: A B L L1
IH : forall A J B L, is_list J -> member A J * -> adj J B L -> member A L
H1 : is_list (A :: L1)
H3 : adj (A :: L1) B L
============================
 member A L

Subgoal 2 is:
 member A L

adj_preserves_member_lem < case H3.
Subgoal 1.1:

Variables: A B L1
IH : forall A J B L, is_list J -> member A J * -> adj J B L -> member A L
H1 : is_list (A :: L1)
H4 : is_o B
H5 : is_list (A :: L1)
============================
 member A (B :: A :: L1)

Subgoal 1.2 is:
 member A (A :: L2)

Subgoal 2 is:
 member A L

adj_preserves_member_lem < search.
Subgoal 1.2:

Variables: A B L1 L2
IH : forall A J B L, is_list J -> member A J * -> adj J B L -> member A L
H1 : is_list (A :: L1)
H4 : is_o A
H5 : adj L1 B L2
============================
 member A (A :: L2)

Subgoal 2 is:
 member A L

adj_preserves_member_lem < search.
Subgoal 2:

Variables: A B L L1 B1
IH : forall A J B L, is_list J -> member A J * -> adj J B L -> member A L
H1 : is_list (B1 :: L1)
H3 : adj (B1 :: L1) B L
H4 : member A L1 *
============================
 member A L

adj_preserves_member_lem < case H3.
Subgoal 2.1:

Variables: A B L1 B1
IH : forall A J B L, is_list J -> member A J * -> adj J B L -> member A L
H1 : is_list (B1 :: L1)
H4 : member A L1 *
H5 : is_o B
H6 : is_list (B1 :: L1)
============================
 member A (B :: B1 :: L1)

Subgoal 2.2 is:
 member A (B1 :: L2)

adj_preserves_member_lem < search.
Subgoal 2.2:

Variables: A B L1 B1 L2
IH : forall A J B L, is_list J -> member A J * -> adj J B L -> member A L
H1 : is_list (B1 :: L1)
H4 : member A L1 *
H5 : is_o B1
H6 : adj L1 B L2
============================
 member A (B1 :: L2)

adj_preserves_member_lem < case H1.
Subgoal 2.2:

Variables: A B L1 B1 L2
IH : forall A J B L, is_list J -> member A J * -> adj J B L -> member A L
H4 : member A L1 *
H5 : is_o B1
H6 : adj L1 B L2
H7 : is_o B1
H8 : is_list L1
============================
 member A (B1 :: L2)

adj_preserves_member_lem < apply IH to H8 H4 H6.
Subgoal 2.2:

Variables: A B L1 B1 L2
IH : forall A J B L, is_list J -> member A J * -> adj J B L -> member A L
H4 : member A L1 *
H5 : is_o B1
H6 : adj L1 B L2
H7 : is_o B1
H8 : is_list L1
H9 : member A L2
============================
 member A (B1 :: L2)

adj_preserves_member_lem < search.
Proof completed.
Abella < Theorem adj_preserves_member : 
forall A J B L, member A J -> adj J B L -> member A L.


============================
 forall A J B L, member A J -> adj J B L -> member A L

adj_preserves_member < intros.

Variables: A J B L
H1 : member A J
H2 : adj J B L
============================
 member A L

adj_preserves_member < apply adj_1_is_list to H2.

Variables: A J B L
H1 : member A J
H2 : adj J B L
H3 : is_list J
============================
 member A L

adj_preserves_member < backchain adj_preserves_member_lem.
Proof completed.
Abella < Theorem perm_preserves_member : 
forall A K L, perm K L -> member A K -> member A L.


============================
 forall A K L, perm K L -> member A K -> member A L

perm_preserves_member < induction on 2.

IH : forall A K L, perm K L -> member A K * -> member A L
============================
 forall A K L, perm K L -> member A K @ -> member A L

perm_preserves_member < intros.

Variables: A K L
IH : forall A K L, perm K L -> member A K * -> member A L
H1 : perm K L
H2 : member A K @
============================
 member A L

perm_preserves_member < case H2.
Subgoal 1:

Variables: A L L1
IH : forall A K L, perm K L -> member A K * -> member A L
H1 : perm (A :: L1) L
============================
 member A L

Subgoal 2 is:
 member A L

perm_preserves_member < apply perm_cons_1 to *H1.
Subgoal 1:

Variables: A L L1 J
IH : forall A K L, perm K L -> member A K * -> member A L
H3 : adj J A L
H4 : perm L1 J
============================
 member A L

Subgoal 2 is:
 member A L

perm_preserves_member < backchain adj_member.
Subgoal 2:

Variables: A L L1 B
IH : forall A K L, perm K L -> member A K * -> member A L
H1 : perm (B :: L1) L
H3 : member A L1 *
============================
 member A L

perm_preserves_member < apply perm_cons_1 to *H1.
Subgoal 2:

Variables: A L L1 B J
IH : forall A K L, perm K L -> member A K * -> member A L
H3 : member A L1 *
H4 : adj J B L
H5 : perm L1 J
============================
 member A L

perm_preserves_member < apply IH to *H5 *H3.
Subgoal 2:

Variables: A L L1 B J
IH : forall A K L, perm K L -> member A K * -> member A L
H4 : adj J B L
H6 : member A J
============================
 member A L

perm_preserves_member < backchain adj_preserves_member.
Proof completed.
Abella <