Commit 697fed0c authored by Adam Chlipala's avatar Adam Chlipala

Start of Intro

parent 0f1efe21
...@@ -11,3 +11,5 @@ syntax: glob ...@@ -11,3 +11,5 @@ syntax: glob
*/cpdt.* */cpdt.*
*/*.log */*.log
book/html/coqdoc.css
book/html/*.html
MODULES_NODOC := Tactics MODULES_NODOC := Tactics
MODULES_DOC := StackMachine MODULES_DOC := Intro StackMachine
MODULES := $(MODULES_NODOC) $(MODULES_DOC) MODULES := $(MODULES_NODOC) $(MODULES_DOC)
VS := $(MODULES:%=src/%.v) VS := $(MODULES:%=src/%.v)
VS_DOC := $(MODULES_DOC:%=%.v) VS_DOC := $(MODULES_DOC:%=%.v)
GLOBALS := .coq_globals GLOBALS := .coq_globals
.PHONY: coq clean doc .PHONY: coq clean doc dvi html
coq: Makefile.coq coq: Makefile.coq
make -f Makefile.coq make -f Makefile.coq
...@@ -21,11 +21,20 @@ clean:: Makefile.coq ...@@ -21,11 +21,20 @@ clean:: Makefile.coq
rm -f Makefile.coq .depend $(GLOBALS) \ rm -f Makefile.coq .depend $(GLOBALS) \
latex/*.sty latex/cpdt.* latex/*.sty latex/cpdt.*
doc: latex/cpdt.dvi doc: latex/cpdt.dvi html
latex/cpdt.tex: $(VS) latex/cpdt.tex: $(VS)
cd src ; coqdoc --latex $(VS_DOC) \ cd src ; coqdoc --latex $(VS_DOC) \
-p "\usepackage{url}" \
-o ../latex/cpdt.tex -o ../latex/cpdt.tex
latex/cpdt.dvi: latex/cpdt.tex latex/cpdt.dvi: latex/cpdt.tex
cd latex ; latex cpdt cd latex ; latex cpdt
html: $(VS)
cd src ; coqdoc $(VS_DOC) \
--glob-from ../$(GLOBALS) \
-d ../html
dvi:
xdvi latex/cpdt
This diff is collapsed.
...@@ -16,106 +16,99 @@ Require Import Tactics. ...@@ -16,106 +16,99 @@ Require Import Tactics.
(** * Arithmetic expressions over natural numbers *) (** * Arithmetic expressions over natural numbers *)
(* begin hide *)
Module Nat.
(* end hide *)
(** ** Source language *) (** ** Source language *)
Inductive binop : Set := Plus | Times. Inductive binop : Set := Plus | Times.
Inductive exp : Set := Inductive exp : Set :=
| Const : nat -> exp | Const : nat -> exp
| Binop : binop -> exp -> exp -> exp. | Binop : binop -> exp -> exp -> exp.
Definition binopDenote (b : binop) : nat -> nat -> nat := Definition binopDenote (b : binop) : nat -> nat -> nat :=
match b with match b with
| Plus => plus | Plus => plus
| Times => mult | Times => mult
end. end.
Fixpoint expDenote (e : exp) : nat := Fixpoint expDenote (e : exp) : nat :=
match e with match e with
| Const n => n | Const n => n
| Binop b e1 e2 => (binopDenote b) (expDenote e1) (expDenote e2) | Binop b e1 e2 => (binopDenote b) (expDenote e1) (expDenote e2)
end. end.
(** ** Target language *) (** ** Target language *)
Inductive instr : Set := Inductive instr : Set :=
| IConst : nat -> instr | IConst : nat -> instr
| IBinop : binop -> instr. | IBinop : binop -> instr.
Definition prog := list instr. Definition prog := list instr.
Definition stack := list nat. Definition stack := list nat.
Definition instrDenote (i : instr) (s : stack) : option stack := Definition instrDenote (i : instr) (s : stack) : option stack :=
match i with match i with
| IConst n => Some (n :: s) | IConst n => Some (n :: s)
| IBinop b => | IBinop b =>
match s with match s with
| arg1 :: arg2 :: s' => Some ((binopDenote b) arg1 arg2 :: s') | arg1 :: arg2 :: s' => Some ((binopDenote b) arg1 arg2 :: s')
| _ => None | _ => None
end end
end. end.
Fixpoint progDenote (p : prog) (s : stack) {struct p} : option stack := Fixpoint progDenote (p : prog) (s : stack) {struct p} : option stack :=
match p with match p with
| nil => Some s | nil => Some s
| i :: p' => | i :: p' =>
match instrDenote i s with match instrDenote i s with
| None => None | None => None
| Some s' => progDenote p' s' | Some s' => progDenote p' s'
end end
end. end.
(** ** Translation *) (** ** Translation *)
Fixpoint compile (e : exp) : prog := Fixpoint compile (e : exp) : prog :=
match e with match e with
| Const n => IConst n :: nil | Const n => IConst n :: nil
| Binop b e1 e2 => compile e2 ++ compile e1 ++ IBinop b :: nil | Binop b e1 e2 => compile e2 ++ compile e1 ++ IBinop b :: nil
end. end.
(** ** Translation correctness *) (** ** Translation correctness *)
Lemma compileCorrect' : forall e s p, progDenote (compile e ++ p) s = Lemma compileCorrect' : forall e s p, progDenote (compile e ++ p) s =
progDenote p (expDenote e :: s). progDenote p (expDenote e :: s).
induction e. induction e.
intros. intros.
unfold compile. unfold compile.
unfold expDenote. unfold expDenote.
simpl. simpl.
reflexivity. reflexivity.
intros. intros.
unfold compile. unfold compile.
fold compile. fold compile.
unfold expDenote. unfold expDenote.
fold expDenote. fold expDenote.
rewrite app_ass. rewrite app_ass.
rewrite IHe2. rewrite IHe2.
rewrite app_ass. rewrite app_ass.
rewrite IHe1. rewrite IHe1.
simpl. simpl.
reflexivity. reflexivity.
Abort. Abort.
Lemma compileCorrect' : forall e s p, progDenote (compile e ++ p) s = Lemma compileCorrect' : forall e s p, progDenote (compile e ++ p) s =
progDenote p (expDenote e :: s). progDenote p (expDenote e :: s).
induction e; crush. induction e; crush.
Qed. Qed.
Theorem compileCorrect : forall e, progDenote (compile e) nil = Some (expDenote e :: nil). Theorem compileCorrect : forall e, progDenote (compile e) nil = Some (expDenote e :: nil).
intro. intro.
rewrite (app_nil_end (compile e)). rewrite (app_nil_end (compile e)).
rewrite compileCorrect'. rewrite compileCorrect'.
reflexivity. reflexivity.
Qed. Qed.
(* begin hide *)
End Nat.
(* end hide *)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment