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
78c18db5
Commit
78c18db5
authored
Oct 28, 2011
by
Adam Chlipala
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
First draft of full prose for GeneralRec
parent
7057f379
Changes
3
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
103 additions
and
22 deletions
+103
-22
cpdt.bib
latex/cpdt.bib
+19
-0
GeneralRec.v
src/GeneralRec.v
+83
-21
Match.v
src/Match.v
+1
-1
No files found.
latex/cpdt.bib
View file @
78c18db5
...
...
@@ -267,3 +267,22 @@
publisher = "MIT Press",
chapter = "8"
}
@article{Capretta,
author = {Venanzio Capretta},
title = {General Recursion via Coinductive Types},
journal = {Logical Methods in Computer Science},
volume = 1,
number = 2,
year = 2005,
pages = {1--18},
}
@inproceedings{Megacz,
author = {Adam Megacz},
title = {A coinductive monad for prop-bounded recursion},
booktitle = {Proceedings of the {ACM} Workshop Programming
Languages meets Program Verification},
pages = {11--20},
year = {2007},
}
src/GeneralRec.v
View file @
78c18db5
This diff is collapsed.
Click to expand it.
src/Match.v
View file @
78c18db5
...
...
@@ -465,7 +465,7 @@ Error: variable n should be bound to a term.
>>
*
)
Abort
.
(
**
What
is
going
wrong
here
?
The
answer
has
to
do
with
the
dual
status
of
Ltac
as
both
a
purely
functional
and
an
imperative
programming
language
.
The
basic
programming
language
is
purely
functional
,
but
tactic
scripts
are
one
%
``
%
#
"#datatype#"
#
%
''
%
that
can
be
returned
by
such
programs
,
and
Coq
will
run
such
a
script
using
an
imperative
semantics
that
mutates
proof
states
.
Readers
familiar
with
%
\
index
{
monad
s
}
\
index
{
Haskell
}%
monadic
programming
in
Haskell
%~
\
cite
{
monads
,
IO
}%
may
recognize
a
similarity
.
Side
-
effecting
Haskell
programs
can
be
thought
of
as
pure
programs
that
return
%
\
emph
{%
#
<
i
>
#
the
code
of
programs
in
an
imperative
language
#
</
i
>
#
%}%,
where
some
out
-
of
-
band
mechanism
takes
responsibility
for
running
these
derived
programs
.
In
this
way
,
Haskell
remains
pure
,
while
supporting
usual
input
-
output
side
effects
and
more
.
Ltac
uses
the
same
basic
mechanism
,
but
in
a
dynamically
typed
setting
.
Here
the
embedded
imperative
language
includes
all
the
tactics
we
have
been
applying
so
far
.
(
**
What
is
going
wrong
here
?
The
answer
has
to
do
with
the
dual
status
of
Ltac
as
both
a
purely
functional
and
an
imperative
programming
language
.
The
basic
programming
language
is
purely
functional
,
but
tactic
scripts
are
one
%
``
%
#
"#datatype#"
#
%
''
%
that
can
be
returned
by
such
programs
,
and
Coq
will
run
such
a
script
using
an
imperative
semantics
that
mutates
proof
states
.
Readers
familiar
with
%
\
index
{
monad
}
\
index
{
Haskell
}%
monadic
programming
in
Haskell
%~
\
cite
{
monads
,
IO
}%
may
recognize
a
similarity
.
Side
-
effecting
Haskell
programs
can
be
thought
of
as
pure
programs
that
return
%
\
emph
{%
#
<
i
>
#
the
code
of
programs
in
an
imperative
language
#
</
i
>
#
%}%,
where
some
out
-
of
-
band
mechanism
takes
responsibility
for
running
these
derived
programs
.
In
this
way
,
Haskell
remains
pure
,
while
supporting
usual
input
-
output
side
effects
and
more
.
Ltac
uses
the
same
basic
mechanism
,
but
in
a
dynamically
typed
setting
.
Here
the
embedded
imperative
language
includes
all
the
tactics
we
have
been
applying
so
far
.
Even
basic
[
idtac
]
is
an
embedded
imperative
program
,
so
we
may
not
automatically
mix
it
with
purely
functional
code
.
In
fact
,
a
semicolon
operator
alone
marks
a
span
of
Ltac
code
as
an
embedded
tactic
script
.
This
makes
some
amount
of
sense
,
since
pure
functional
languages
have
no
need
for
sequencing
:
since
they
lack
side
effects
,
there
is
no
reason
to
run
an
expression
and
then
just
throw
away
its
value
and
move
on
to
another
expression
.
...
...
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