Library HigmanCF.Higman2


Require Import List.

Inductive letter : Set :=
  | A : letter
  | B : letter.

Definition word := list letter.

Inductive emb : wordwordProp :=
  | emb0 : ys : word, emb nil ys
  | emb1 :
       (xs ys : list letter) (y : letter),
      emb xs ysemb xs (y :: ys)
  | emb2 :
       (xs ys : list letter) (x : letter),
      emb xs ysemb (x :: xs) (x :: ys).

Inductive L (v : word) : list wordSet :=
  | L0 : (w : word) (ws : list word), emb w vL v (w :: ws)
  | L1 : (w : word) (ws : list word), L v wsL v (w :: ws).

Inductive good : list wordSet :=
  | good0 : (ws : list word) (w : word), L w wsgood (w :: ws)
  | good1 : (ws : list word) (w : word), good wsgood (w :: ws).

Inductive R (a : letter) : list wordlist wordSet :=
  | R0 : R a nil nil
  | R1 :
       (vs ws : list word) (w : word),
      R a vs wsR a (w :: vs) ((a :: w) :: ws).

Inductive T (a : letter) : list wordlist wordSet :=
  | T0 :
       (b : letter) (w : word) (ws zs : list word),
      a bR b ws zsT a (w :: zs) ((a :: w) :: zs)
  | T1 :
       (w : word) (ws zs : list word),
      T a ws zsT a (w :: ws) ((a :: w) :: zs)
  | T2 :
       (b : letter) (w : word) (ws zs : list word),
      a bT a ws zsT a ws ((b :: w) :: zs).

Inductive bar : list wordSet :=
  | bar1 : ws : list word, good wsbar ws
  | bar2 : ws : list word, ( w : word, bar (w :: ws)) → bar ws.

Hint Constructors emb.
Hint Constructors L.
Hint Constructors good.
Hint Constructors R.
Hint Constructors T.
Hint Constructors bar.
Hint Extern 5 (?X1 ?X2) ⇒ intro; discriminate.

Theorem prop1 : ws : list word, bar (nil :: ws).
auto.
Defined.
Hint Resolve prop1.

Theorem lemma1 :
  (ws : list word) (xs : word) (x : letter), L xs wsL (x :: xs) ws.
simple induction 1; auto.
Defined.
Hint Resolve lemma1.

Theorem lemma2' :
  (vs ws : list word) (x : letter) (xs : word),
 R x vs wsL xs vsL (x :: xs) ws.
simple induction 1.
inversion 1.
inversion 3; auto.
Defined.
Hint Resolve lemma2'.

Theorem lemma2 :
  (vs ws : list word) (a : letter), R a vs wsgood vsgood ws.
simple induction 1; auto.
inversion 3; eauto.
Defined.
Hint Resolve lemma2.

Theorem lemma3' :
  (vs ws : list word) (x : letter) (xs : word),
 T x vs wsL xs vsL (x :: xs) ws.
simple induction 1; auto; inversion 3; auto.
Defined.
Hint Resolve lemma3'.

Theorem lemma3 :
  (ws zs : list word) (a : letter), T a ws zsgood wsgood zs.
simple induction 1; auto; inversion 3; eauto.
Defined.
Hint Resolve lemma3.

Theorem lemma4 :
  (ws zs : list word) (a : letter), R a ws zsws nilT a ws zs.
simple induction 1.
tauto.
intro.
case vs.
inversion 1.
intros.
case a.
apply (T0 A B w nil); auto.
apply (T0 B A w nil); auto.
auto.
Defined.
Hint Resolve lemma4.

Theorem letter_neq : a b c : letter, a bc ac = b.
intros a b c; case a; case b; case c; tauto.
Qed.

Theorem letter_eq_dec : a b : letter, {a = b} + {a b}.
intros.
decide equality.
Defined.

Theorem prop2 :
  (a b : letter) (xs : list word),
 a b
 bar xs
  ys : list word,
 bar ys zs : list word, T a xs zsT b ys zsbar zs.
intros a b xs neq.
simple induction 1.
eauto.
simple induction 3.
eauto.
intros.
apply bar2.
intro.
case w.
apply prop1.
intros.
elim (letter_eq_dec l a).
intro; rewrite a0; eauto.
intro; rewrite (letter_neq a b l neq b2); eauto.
Defined.
Hint Resolve prop2.

Theorem prop3 :
  (a : letter) (xs : list word),
 bar xs zs : list word, xs nilR a xs zsbar zs.
simple induction 1.
eauto.
intros.
apply bar2.
simple induction w.
auto.
intros.
elim (letter_eq_dec a0 a).
intro.
rewrite a1; eauto.
intro.
apply (prop2 a0 a (l :: zs) b0 H3 ws); eauto.
Defined.
Hint Resolve prop3.

Theorem higman : bar nil.
apply bar2.
simple induction w; eauto.
Defined.
Hint Resolve higman.

Inductive is_prefix (A : Set) : list A → (natA) → Prop :=
  | is_prefix_nil : f : natA, is_prefix A nil f
  | is_prefix_cons :
       (f : natA) (x : A) (xs : list A),
      x = f (length xs) → is_prefix A xs fis_prefix A (x :: xs) f.
Hint Constructors is_prefix.

Theorem L_idx :
  (f : natword) (w : word) (ws : list word),
 L w wsis_prefix word ws f{i : nat | emb (f i) w i < length ws}.
simple induction 1.
intros.
(length ws0).
inversion_clear H0.
split.
rewrite H1 in e.
assumption.
auto.
intros.
cut (is_prefix word ws0 f).
intro.
elim (H0 H2).
intros.
x.
elim p.
split.
assumption.
apply (le_S (S x) (length ws0)).
assumption.
inversion H1.
assumption.
Defined.

Theorem good_idx :
  (f : natword) (ws : list word),
 good ws
 is_prefix word ws f{i : nat & {j : nat | emb (f i) (f j) i < j}}.
simple induction 1.
intros.
elim (L_idx f w ws0 l).
intros.
x.
(length ws0).
elim p.
intros.
inversion H0.
split.
rewrite H5 in H1.
assumption.
assumption.
inversion H0.
assumption.
intros.
cut (is_prefix word ws0 f).
assumption.
inversion H1.
assumption.
Defined.

Theorem bar_idx :
  (f : natword) (ws : list word),
 bar ws
 is_prefix word ws f{i : nat & {j : nat | emb (f i) (f j) i < j}}.
simple induction 1.
apply good_idx.
intros.
apply (H0 (f (length ws0))).
apply is_prefix_cons.
reflexivity.
assumption.
Defined.

Theorem higman_idx :
  f : natword, {i : nat & {j : nat | emb (f i) (f j) i < j}}.
intro.
apply (bar_idx f nil).
apply higman.
apply is_prefix_nil.
Defined.

Extraction NoInline lemma1.
Extraction "higman2.ml" higman_idx.