playground/coq/re.v

110 lines
2.3 KiB
Coq
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.
*)