Library PAutomata.PGM.String



Require Import List.
Require Import Bool.

Set Implicit Arguments.
Unset Strict Implicit.

Section LETTER_DEF.

Inductive letter : Set :=
  | A : letter
  | B : letter
  | C : letter
  | D : letter
  | E : letter
  | F : letter
  | G : letter
  | H : letter
  | I : letter
  | J : letter
  | K : letter
  | L : letter
  | M : letter
  | N : letter
      
  | P : letter
  | Q : letter
  | R : letter
      
  | T : letter
  | U : letter
  | V : letter
  | W : letter
  | X : letter
  | Y : letter
  | Z : letter.

Definition eq_letter (l1 l2 : letter) : bool :=
  match l1, l2 with
  | A, Atrue
  | B, Btrue
  | C, Ctrue
  | D, Dtrue
  | E, Etrue
  | F, Ftrue
  | G, Gtrue
  | H, Htrue
  | I, Itrue
  | J, Jtrue
  | K, Ktrue
  | L, Ltrue
  | M, Mtrue
  | LETTER_DEF.N, LETTER_DEF.Ntrue
      
  | P, Ptrue
  | Q, Qtrue
  | R, Rtrue
      
  | T, Ttrue
  | U, Utrue
  | V, Vtrue
  | W, Wtrue
  | X, Xtrue
  | Y, Ytrue
  | Z, Ztrue
  | _, _false
  end.

End LETTER_DEF.

Section STRING_DEF.

Definition string := list letter.

Definition voidstring : string := nil.

Fixpoint eq_string (str1 str2 : string) {struct str2} : bool :=
  match str1, str2 with
  | nil, niltrue
  | l1 :: str11, l2 :: str21
      if eq_letter l1 l2 then eq_string str11 str21 else false
  | _, _false
  end.

Fixpoint prefix_string (target prefix : string) {struct prefix} : bool :=
  match target, prefix with
  | nil, niltrue
  | l1 :: str1, l2 :: str2
      if eq_letter l1 l2 then prefix_string str1 str2 else false
  | _, _false
  end.

Fixpoint extract_string (target prefix : string) {struct prefix} : string :=
  match target, prefix with
  | _, niltarget
  | l1 :: str1, l2 :: str2
      if eq_letter l1 l2 then extract_string str1 str2 else voidstring
  | nil, l2 :: str2voidstring
  end.

End STRING_DEF.