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, A => true
| B, B => true
| C, C => true
| D, D => true
| E, E => true
| F, F => true
| G, G => true
| H, H => true
| I, I => true
| J, J => true
| K, K => true
| L, L => true
| M, M => true
| LETTER_DEF.N, LETTER_DEF.N => true
| P, P => true
| Q, Q => true
| R, R => true
| T, T => true
| U, U => true
| V, V => true
| W, W => true
| X, X => true
| Y, Y => true
| Z, Z => true
| _, _ => 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, nil => true
| 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, nil => true
| 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
| _, nil => target
| l1 :: str1, l2 :: str2 =>
if eq_letter l1 l2 then extract_string str1 str2 else voidstring
| nil, l2 :: str2 => voidstring
end.
End STRING_DEF.
