110 lines
2.3 KiB
Coq
110 lines
2.3 KiB
Coq
|
Require Import Ascii String.
|
|||
|
|
|||
|
Inductive re : Set :=
|
|||
|
| Atom: Ascii.ascii -> re
|
|||
|
| Epsilon: re
|
|||
|
| Dot: re
|
|||
|
| Concat: re -> re -> re
|
|||
|
| Alt: re -> re -> re
|
|||
|
| Star: re -> re.
|
|||
|
|
|||
|
Inductive reDenote : re -> string -> Prop :=
|
|||
|
| AtomDe: forall ch:Ascii.ascii,
|
|||
|
reDenote (Atom ch) (String ch EmptyString)
|
|||
|
| EpsilonDe: reDenote Epsilon EmptyString
|
|||
|
| DotDe: forall ch:Ascii.ascii,
|
|||
|
reDenote Dot (String ch EmptyString)
|
|||
|
| ConcatDe r1 r2: forall s1 s2 s:string,
|
|||
|
reDenote r1 s1 -> reDenote r2 s2 -> s = append s1 s2
|
|||
|
-> reDenote (Concat r1 r2) s
|
|||
|
| AltDe r1 r2: forall s:string,
|
|||
|
reDenote r1 s \/ reDenote r2 s
|
|||
|
-> reDenote (Alt r1 r2) s
|
|||
|
| StarDe r: forall s:string,
|
|||
|
reDenote (Alt (Concat r (Star r)) Epsilon) s
|
|||
|
-> reDenote (Star r) s.
|
|||
|
|
|||
|
(*
|
|||
|
Definition transl {r:re} {s:string} (inp:re) : reDenote r e :=
|
|||
|
match inp with
|
|||
|
| Atom
|
|||
|
| Epsilon: re
|
|||
|
| Dot: re
|
|||
|
| Concat: re -> re -> re
|
|||
|
| Alt: re -> re -> re
|
|||
|
| Star: re -> re.
|
|||
|
end.
|
|||
|
|
|||
|
re -> reDenote
|
|||
|
forall s:string, (r:re) : reDenote r s
|
|||
|
Atom ch => AtomDe ch
|
|||
|
*)
|
|||
|
|
|||
|
Infix "│" := Alt (at level 51, only parsing).
|
|||
|
Infix ";" := Concat (at level 5, only parsing).
|
|||
|
Notation " 'ε' " := Epsilon (only parsing).
|
|||
|
|
|||
|
Goal
|
|||
|
reDenote (Star (Atom "a"%char)) ""%string.
|
|||
|
Proof.
|
|||
|
refine (StarDe (Atom "a"%char) _ _).
|
|||
|
refine (AltDe _ _ _ _).
|
|||
|
right.
|
|||
|
exact EpsilonDe.
|
|||
|
Qed.
|
|||
|
|
|||
|
Ltac rhamm :=
|
|||
|
match goal with
|
|||
|
| _ => auto
|
|||
|
| [ |- reDenote (Star _) _ ] => auto
|
|||
|
end.
|
|||
|
|
|||
|
|
|||
|
Goal
|
|||
|
reDenote (Star (Atom "a"%char)) "a"%string.
|
|||
|
Proof.
|
|||
|
refine (StarDe _ _ _).
|
|||
|
refine (AltDe _ _ _ _).
|
|||
|
left.
|
|||
|
refine (ConcatDe _ _ _ _ _ _ _ _).
|
|||
|
- exact (AtomDe "a").
|
|||
|
- refine (StarDe _ _ _).
|
|||
|
refine (AltDe _ Epsilon ""%string _).
|
|||
|
right.
|
|||
|
exact EpsilonDe.
|
|||
|
- reflexivity.
|
|||
|
Show Proof.
|
|||
|
Restart.
|
|||
|
eapply StarDe.
|
|||
|
eapply AltDe.
|
|||
|
left.
|
|||
|
eapply ConcatDe.
|
|||
|
- eapply AtomDe.
|
|||
|
- eapply StarDe.
|
|||
|
eapply AltDe.
|
|||
|
right.
|
|||
|
eapply EpsilonDe.
|
|||
|
- reflexivity.
|
|||
|
Show Proof.
|
|||
|
Qed.
|
|||
|
|
|||
|
Goal
|
|||
|
reDenote (Atom "a"%char) "a"%string.
|
|||
|
Proof.
|
|||
|
exact (AtomDe "a"%char).
|
|||
|
Qed.
|
|||
|
|
|||
|
(*
|
|||
|
Inductive reDenote : re -> string -> Prop :=
|
|||
|
| AtomDe: forall (ch:Ascii.ascii) (s:string),
|
|||
|
reDenote (Atom ch) (String ch s)
|
|||
|
| EpsilonDe: forall ch:Ascii.ascii,
|
|||
|
reDenote Epsilon EmptyString.
|
|||
|
| DotDe:: forall ch:Ascii.ascii,
|
|||
|
reDenote Epsilon (String ch EmptyString).
|
|||
|
|
|||
|
| ConcatDe: re -> re -> re
|
|||
|
| AltDe: re -> re -> re
|
|||
|
| StarDe: re -> re.
|
|||
|
*)
|