playground/coq/brzozowski.v

70 lines
1.8 KiB
Coq
Raw Normal View History

2024-02-25 07:10:46 +00:00
Require Import List.
Import ListNotations.
(* Syntax of re *)
Inductive re {A:Type}: Type :=
| ε | Null: re
| Char: A -> re
| Cat: re -> re -> re
| Alt: re -> re -> re
| Star: re -> re.
Arguments re: clear implicits.
Module ReNotations.
Notation "" := Null.
Notation "'↑' a" := (Char a) (at level 10).
Notation "r ''" := (Star r) (at level 20).
Infix ";" := Cat (at level 60, right associativity).
Infix "" := Alt (at level 65, right associativity).
End ReNotations.
(* Small-step operational semantics for re *)
Inductive reDe {A:Type}: list A -> re A -> Prop :=
| εDe: reDe [] ε
| CharDe: forall (a:A), reDe [a] (Char a)
| CatDe: forall (r1 r2:re A) (l1 l2: list A),
reDe l1 r1 -> reDe l2 r2 -> reDe (l1++l2) (Cat r1 r2)
| AltDeL: forall (r1 r2:re A) (l: list A),
reDe l r1 -> reDe l (Alt r1 r2)
| AltDeR: forall (r1 r2:re A) (l: list A),
reDe l r2 -> reDe l (Alt r1 r2)
| StarDeMore: forall (r:re A) (l1 l2:list A),
reDe l1 r -> reDe l2 (Star r) -> reDe (l1++l2) (Star r)
| StarDeDone: forall r:re A, reDe [] r.
Notation "w '⊨' r" := (reDe w r) (at level 50, only parsing).
Section Deriv.
Context {A:Type}.
Variable A_eqb: A -> A -> bool.
(* Brzozowski derivative *)
Fixpoint δ (a:A) (r: re A): re A :=
match r with
| ε | Null => Null
| Char c =>
if A_eqb c a then ε
else Null
| Cat r1 r2 => Cat (δ a r1) r2
| Alt r1 r2 => Alt (δ a r1) (δ a r2)
| Star r' => δ a r' (* ε case won't be possible in derivative *)
end.
End Deriv.
Theorem foo (A:Type) (A_eqb: A -> A -> bool) (r:re A) (a:A) (w:list A):
(a::w) r -> w (δ A_eqb a r).
Proof.
induction r; simpl.
- intro H; inversion H.
- intro H; inversion H.
- intro H.
pv_opt.
repeat in_inv.
induction w.
+ constructor.
+ induction w.
Abort.