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
6a0a19dd
Commit
6a0a19dd
authored
Nov 11, 2009
by
Adam Chlipala
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Touch-ups to DataStruct
parent
c8613be0
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
2 additions
and
2 deletions
+2
-2
Makefile
Makefile
+1
-1
DataStruct.v
src/DataStruct.v
+1
-1
No files found.
Makefile
View file @
6a0a19dd
...
...
@@ -45,7 +45,7 @@ latex/%.dvi: latex/%.tex
cd
latex
;
latex
$*
;
latex
$*
latex/%.pdf
:
latex/%.dvi
cd
latex
;
pdflatex
$*
;
pdflatex
$*
cd
latex
;
pdflatex
$*
html
:
Makefile $(VS) src/toc.html
mkdir
-p
html
...
...
src/DataStruct.v
View file @
6a0a19dd
...
...
@@ -830,7 +830,7 @@ Qed.
Inductive
types
are
often
the
most
pleasant
to
work
with
,
after
someone
has
spent
the
time
implementing
some
basic
library
functions
for
them
,
using
fancy
[
match
]
annotations
.
Many
aspects
of
Coq
'
s
logic
and
tactic
support
are
specialized
to
deal
with
inductive
types
,
and
you
may
miss
out
if
you
use
alternate
encodings
.
Recursive
types
usually
involve
much
less
initial
effort
,
but
they
can
be
less
convenient
to
use
with
proof
automation
.
For
instance
,
the
[
simpl
]
tactic
(
which
is
among
the
ingredients
in
[
crush
])
will
sometimes
be
overzealous
in
simplifying
uses
of
functions
over
recursive
types
.
Consider
a
function
[
replace
]
of
type
[
forall
A
,
filist
A
n
->
fin
n
->
A
->
filist
A
n
]
,
such
that
[
replace
l
f
x
]
should
substitute
[
x
]
for
the
element
in
position
[
f
]
of
[
l
]
.
A
call
to
[
replace
]
on
a
variable
[
l
]
of
type
[
filist
A
(
S
n
)]
would
probably
be
simplified
to
an
explicit
pair
,
even
though
we
know
nothing
about
the
structure
of
[
l
]
beyond
its
type
.
In
a
proof
involving
many
recursive
types
,
this
kind
of
unhelpful
"simplification"
can
lead
to
rapid
bloat
in
the
sizes
of
subgoals
.
Recursive
types
usually
involve
much
less
initial
effort
,
but
they
can
be
less
convenient
to
use
with
proof
automation
.
For
instance
,
the
[
simpl
]
tactic
(
which
is
among
the
ingredients
in
[
crush
])
will
sometimes
be
overzealous
in
simplifying
uses
of
functions
over
recursive
types
.
Consider
a
call
[
get
l
f
]
,
where
variable
[
l
]
has
type
[
filist
A
(
S
n
)]
.
This
expression
would
be
simplified
to
an
explicit
pair
,
even
though
we
know
nothing
about
the
structure
of
[
l
]
beyond
its
type
.
In
a
proof
involving
many
recursive
types
,
this
kind
of
unhelpful
"simplification"
can
lead
to
rapid
bloat
in
the
sizes
of
subgoals
.
Another
disadvantage
of
recursive
types
is
that
they
only
apply
to
type
families
whose
indices
determine
their
"skeletons."
This
is
not
true
for
all
data
structures
;
a
good
counterexample
comes
from
the
richly
-
typed
programming
language
syntax
types
we
have
used
several
times
so
far
.
The
fact
that
a
piece
of
syntax
has
type
[
Nat
]
tells
us
nothing
about
the
tree
structure
of
that
syntax
.
...
...
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