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.
