Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
C
cpdt
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
research
cpdt
Commits
7fa8d745
Commit
7fa8d745
authored
Nov 09, 2009
by
Adam Chlipala
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Most old Sestoft suggestions processed
parent
73aabec8
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
9 additions
and
7 deletions
+9
-7
Makefile
Makefile
+2
-2
InductiveTypes.v
src/InductiveTypes.v
+1
-1
Intro.v
src/Intro.v
+2
-2
Predicates.v
src/Predicates.v
+1
-1
StackMachine.v
src/StackMachine.v
+3
-1
No files found.
Makefile
View file @
7fa8d745
...
...
@@ -41,9 +41,9 @@ latex/%.tex: src/%.v
coqdoc
--interpolate
--latex
-s
$<
-o
$@
latex/%.dvi
:
latex/%.tex
latex
$<
;
latex
$<
cd
latex
;
latex
$*
;
latex
$*
latex/%.pdf
:
latex/
%.dvi
%.pdf
:
%.dvi
pdflatex
$<
html
:
Makefile $(VS) src/toc.html
...
...
src/InductiveTypes.v
View file @
7fa8d745
...
...
@@ -437,7 +437,7 @@ End list.
Implicit
Arguments
Nil
[
T
]
.
(
*
end
hide
*
)
(
**
After
we
end
the
section
,
the
[
Variable
]
s
we
used
are
added
as
extra
function
parameters
for
each
defined
identifier
,
as
needed
.
*
)
(
**
After
we
end
the
section
,
the
[
Variable
]
s
we
used
are
added
as
extra
function
parameters
for
each
defined
identifier
,
as
needed
.
We
verify
that
this
has
happened
using
the
[
Print
]
command
,
a
cousin
of
[
Check
]
which
shows
the
definition
of
a
symbol
,
rather
than
just
its
type
.
*
)
Print
list
.
(
**
%
\
vspace
{-
.15
in
}%
[[
...
...
src/Intro.v
View file @
7fa8d745
...
...
@@ -91,7 +91,7 @@ ACL2 is notable in this field for having only a %\textit{%#<i>#first-order#</i>#
(
**
**
Dependent
Types
*
)
(
**
A
language
of
%
\
textit
{%
#
<
i
>
#
dependent
types
#
</
i
>
#
%}%
may
include
references
to
programs
inside
of
types
.
For
instance
,
the
type
of
an
array
might
include
a
program
expression
giving
the
size
of
the
array
,
making
it
possible
to
verify
lack
of
out
-
of
-
bounds
accesses
statically
.
Dependent
types
can
go
even
further
than
this
,
effectively
capturing
any
correctness
property
in
a
type
.
For
instance
,
later
in
this
book
,
we
will
see
how
to
give
a
Mini
-
ML
compiler
a
type
that
guarantees
that
it
maps
well
-
typed
source
programs
to
well
-
typed
target
programs
.
A
language
of
%
\
textit
{%
#
<
i
>
#
dependent
types
#
</
i
>
#
%}%
may
include
references
to
programs
inside
of
types
.
For
instance
,
the
type
of
an
array
might
include
a
program
expression
giving
the
size
of
the
array
,
making
it
possible
to
verify
absence
of
out
-
of
-
bounds
accesses
statically
.
Dependent
types
can
go
even
further
than
this
,
effectively
capturing
any
correctness
property
in
a
type
.
For
instance
,
later
in
this
book
,
we
will
see
how
to
give
a
Mini
-
ML
compiler
a
type
that
guarantees
that
it
maps
well
-
typed
source
programs
to
well
-
typed
target
programs
.
ACL2
and
HOL
lack
dependent
types
outright
.
PVS
and
Twelf
each
supports
a
different
strict
subset
of
Coq
'
s
dependent
type
language
.
Twelf
'
s
type
language
is
restricted
to
a
bare
-
bones
,
monomorphic
lambda
calculus
,
which
places
serious
restrictions
on
how
complicated
%
\
textit
{%
#
<
i
>
#
computations
inside
types
#
</
i
>
#
%}%
can
be
.
This
restriction
is
important
for
the
soundness
argument
behind
Twelf
'
s
approach
to
representing
and
checking
proofs
.
...
...
@@ -137,7 +137,7 @@ The logic and programming language behind Coq belongs to a type-theory ecosystem
I
think
the
answer
is
simple
.
None
of
the
competition
has
well
-
developed
systems
for
tactic
-
based
theorem
proving
.
Agda
and
Epigram
are
designed
and
marketed
more
as
programming
languages
than
proof
assistants
.
Dependent
types
are
great
,
because
they
often
help
you
prove
deep
theorems
without
doing
anything
that
feels
like
proving
.
Nonetheless
,
almost
any
interesting
certified
programming
project
will
benefit
from
some
activity
that
deserves
to
be
called
proving
,
and
many
interesting
projects
absolutely
require
semi
-
automated
proving
,
if
the
sanity
of
the
programmer
is
to
be
safeguarded
.
Informally
,
proving
is
unavoidable
when
any
correctness
proof
for
a
program
has
a
structure
that
does
not
mirror
the
structure
of
the
program
itself
.
An
example
is
a
compiler
correctness
proof
,
which
probably
proceeds
by
induction
on
program
execution
traces
,
which
have
no
simple
relationship
with
the
structure
of
the
compiler
or
the
structure
of
the
programs
it
compiles
.
In
building
such
proofs
,
a
mature
system
for
scripted
proof
automation
is
invaluable
.
On
the
other
hand
,
Agda
,
Epigram
,
and
similar
tools
have
less
implementation
baggage
associated
with
them
,
and
so
they
tend
to
be
the
default
first
homes
of
innovations
in
practical
type
theory
.
Some
significant
kinds
of
dependently
-
typed
programs
are
much
easier
to
write
in
Agda
and
Epigram
than
in
Coq
.
The
former
tools
may
very
well
be
superior
choices
for
projects
that
do
not
involve
any
"proving."
Anecdotally
,
I
have
gotten
the
impression
that
manual
proving
is
orders
of
magnitudes
more
costly
th
e
n
manual
coping
with
Coq
'
s
lack
of
programming
bells
and
whistles
.
In
this
book
,
I
will
devote
significant
time
to
patterns
for
programming
with
dependent
types
in
Coq
as
it
is
today
.
We
can
hope
that
the
type
theory
community
is
tending
towards
convergence
on
the
right
set
of
features
for
practical
programming
with
dependent
types
,
and
that
we
will
eventually
have
a
single
tool
embodying
those
features
.
On
the
other
hand
,
Agda
,
Epigram
,
and
similar
tools
have
less
implementation
baggage
associated
with
them
,
and
so
they
tend
to
be
the
default
first
homes
of
innovations
in
practical
type
theory
.
Some
significant
kinds
of
dependently
-
typed
programs
are
much
easier
to
write
in
Agda
and
Epigram
than
in
Coq
.
The
former
tools
may
very
well
be
superior
choices
for
projects
that
do
not
involve
any
"proving."
Anecdotally
,
I
have
gotten
the
impression
that
manual
proving
is
orders
of
magnitudes
more
costly
th
a
n
manual
coping
with
Coq
'
s
lack
of
programming
bells
and
whistles
.
In
this
book
,
I
will
devote
significant
time
to
patterns
for
programming
with
dependent
types
in
Coq
as
it
is
today
.
We
can
hope
that
the
type
theory
community
is
tending
towards
convergence
on
the
right
set
of
features
for
practical
programming
with
dependent
types
,
and
that
we
will
eventually
have
a
single
tool
embodying
those
features
.
*
)
...
...
src/Predicates.v
View file @
7fa8d745
...
...
@@ -134,7 +134,7 @@ We have also already seen the definition of [True]. For a demonstration of a lo
]]
The
interested
reader
can
check
that
[
and
]
has
a
Curry
-
Howard
dopp
le
ganger
called
[
prod
]
,
the
type
of
pairs
.
However
,
it
is
generally
most
convenient
to
reason
about
conjunction
using
tactics
.
An
explicit
proof
of
commutativity
of
[
and
]
illustrates
the
usual
suspects
for
such
tasks
.
[
/
\
]
is
an
infix
shorthand
for
[
and
]
.
*
)
The
interested
reader
can
check
that
[
and
]
has
a
Curry
-
Howard
dopp
el
ganger
called
[
prod
]
,
the
type
of
pairs
.
However
,
it
is
generally
most
convenient
to
reason
about
conjunction
using
tactics
.
An
explicit
proof
of
commutativity
of
[
and
]
illustrates
the
usual
suspects
for
such
tasks
.
[
/
\
]
is
an
infix
shorthand
for
[
and
]
.
*
)
Theorem
and_comm
:
P
/
\
Q
->
Q
/
\
P
.
...
...
src/StackMachine.v
View file @
7fa8d745
...
...
@@ -486,6 +486,8 @@ Qed.
(
**
We
need
only
to
state
the
basic
inductive
proof
scheme
and
call
a
tactic
that
automates
the
tedious
reasoning
in
between
.
In
contrast
to
the
period
tactic
terminator
from
our
last
proof
,
the
semicolon
tactic
separator
supports
structured
,
compositional
proofs
.
The
tactic
[
t1
;
t2
]
has
the
effect
of
running
[
t1
]
and
then
running
[
t2
]
on
each
remaining
subgoal
.
The
semicolon
is
one
of
the
most
fundamental
building
blocks
of
effective
proof
automation
.
The
period
terminator
is
very
useful
for
exploratory
proving
,
where
you
need
to
see
intermediate
proof
states
,
but
final
proofs
of
any
serious
complexity
should
have
just
one
period
,
terminating
a
single
compound
tactic
that
probably
uses
semicolons
.
The
[
crush
]
tactic
comes
from
the
library
associated
with
this
book
and
is
not
part
of
the
Coq
standard
library
.
The
book
'
s
library
contains
a
number
of
other
tactics
that
are
especially
helpful
in
highly
-
automated
proofs
.
The
proof
of
our
main
theorem
is
now
easy
.
We
prove
it
with
four
period
-
terminated
tactics
,
though
separating
them
with
semicolons
would
work
as
well
;
the
version
here
is
easier
to
step
through
.
*
)
Theorem
compile_correct
:
forall
e
,
progDenote
(
compile
e
)
nil
=
Some
(
expDenote
e
::
nil
)
.
...
...
@@ -700,7 +702,7 @@ Fixpoint vstack (ts : tstack) : Set :=
|
t
::
ts
'
=>
typeDenote
t
*
vstack
ts
'
end
%
type
.
(
**
This
is
another
[
Set
]
-
valued
function
.
This
time
it
is
recursive
,
which
is
perfectly
valid
,
since
[
Set
]
is
not
treated
specially
in
determining
which
functions
may
be
written
.
We
say
that
the
value
stack
of
an
empty
stack
type
is
any
value
of
type
[
unit
]
,
which
has
just
a
single
value
,
[
tt
]
.
A
nonempty
stack
type
leads
to
a
value
stack
that
is
a
pair
,
whose
first
element
has
the
proper
type
and
whose
second
element
follows
the
representation
for
the
remainder
of
the
stack
type
.
(
**
This
is
another
[
Set
]
-
valued
function
.
This
time
it
is
recursive
,
which
is
perfectly
valid
,
since
[
Set
]
is
not
treated
specially
in
determining
which
functions
may
be
written
.
We
say
that
the
value
stack
of
an
empty
stack
type
is
any
value
of
type
[
unit
]
,
which
has
just
a
single
value
,
[
tt
]
.
A
nonempty
stack
type
leads
to
a
value
stack
that
is
a
pair
,
whose
first
element
has
the
proper
type
and
whose
second
element
follows
the
representation
for
the
remainder
of
the
stack
type
.
We
write
[
%
type
]
so
that
Coq
knows
to
interpret
[
*
]
as
Cartesian
product
rather
than
multiplication
.
This
idea
of
programming
with
types
can
take
a
while
to
internalize
,
but
it
enables
a
very
simple
definition
of
instruction
denotation
.
Our
definition
is
like
what
you
might
expect
from
a
Lisp
-
like
version
of
ML
that
ignored
type
information
.
Nonetheless
,
the
fact
that
[
tinstrDenote
]
passes
the
type
-
checker
guarantees
that
our
stack
machine
programs
can
never
go
wrong
.
*
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment