Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Joshua Yanovski
iriscoq
Commits
9589d1ba
Commit
9589d1ba
authored
Feb 25, 2016
by
Robbert Krebbers
Browse files
Make identation of solve_proper and f_equiv more consistent.
parent
00a054f1
Changes
1
Hide whitespace changes
Inline
Sidebyside
Showing
1 changed file
with
33 additions
and
34 deletions
+33
34
prelude/tactics.v
prelude/tactics.v
+33
34
No files found.
prelude/tactics.v
View file @
9589d1ba
...
...
@@ 234,40 +234,39 @@ Ltac setoid_subst :=
Ltac
f_equiv
:=
(
*
Deal
with
"pointwise_relation"
*
)
repeat
lazymatch
goal
with


pointwise_relation
_
_
_
_
=>
intros
?
end
;


pointwise_relation
_
_
_
_
=>
intros
?
end
;
(
*
Normalize
away
equalities
.
*
)
subst
;
(
*
repeatedly
apply
congruence
lemmas
and
use
the
equalities
in
the
hypotheses
.
*
)
first
[
reflexivity

assumption

symmetry
;
assumption

match
goal
with
(
*
We
support
matches
on
both
sides
,
*
if
*
they
concern
the
same
variable
.
TODO:
We
should
support
different
variables
,
provided
that
we
can
derive
contradictions
for
the
off

diagonal
cases
.
*
)


?
R
(
match
?
x
with
_
=>
_
end
)
(
match
?
x
with
_
=>
_
end
)
=>
destruct
x
;
f_equiv
(
*
First
assume
that
the
arguments
need
the
same
relation
as
the
result
*
)


?
R
(
?
f
?
x
)
(
?
f
_
)
=>
apply
(
_
:
Proper
(
R
==>
R
)
f
);
f_equiv


?
R
(
?
f
?
x
?
y
)
(
?
f
_
_
)
=>
apply
(
_
:
Proper
(
R
==>
R
==>
R
)
f
);
f_equiv
(
*
Next
,
try
to
infer
the
relation
.
Unfortunately
,
there
is
an
instance
of
Proper
for
(
eq
==>
_
),
which
will
always
be
matched
.
*
)
(
*
TODO
:
Can
we
exclude
that
instance
?
*
)
(
*
TODO
:
If
some
of
the
arguments
are
the
same
,
we
could
also
query
for
"pointwise_relation"
'
s
.
But
that
leads
to
a
combinatorial
explosion
about
which
arguments
are
and
which
are
not
the
same
.
*
)


?
R
(
?
f
?
x
)
(
?
f
_
)
=>
apply
(
_
:
Proper
(
_
==>
R
)
f
);
f_equiv


?
R
(
?
f
?
x
?
y
)
(
?
f
_
_
)
=>
apply
(
_
:
Proper
(
_
==>
_
==>
R
)
f
);
f_equiv
(
*
In
case
the
function
symbol
differs
,
but
the
arguments
are
the
same
,
maybe
we
have
a
pointwise_relation
in
our
context
.
*
)

H
:
pointwise_relation
_
?
R
?
f
?
g

?
R
(
?
f
?
x
)
(
?
g
?
x
)
=>
apply
H
;
f_equiv
end

idtac
(
*
Let
the
user
solve
this
goal
*
)
].
try
match
goal
with

_
=>
first
[
reflexivity

assumption

symmetry
;
assumption
]
(
*
We
support
matches
on
both
sides
,
*
if
*
they
concern
the
same
variable
.
TODO:
We
should
support
different
variables
,
provided
that
we
can
derive
contradictions
for
the
off

diagonal
cases
.
*
)


?
R
(
match
?
x
with
_
=>
_
end
)
(
match
?
x
with
_
=>
_
end
)
=>
destruct
x
;
f_equiv
(
*
First
assume
that
the
arguments
need
the
same
relation
as
the
result
*
)


?
R
(
?
f
?
x
)
(
?
f
_
)
=>
apply
(
_
:
Proper
(
R
==>
R
)
f
);
f_equiv


?
R
(
?
f
?
x
?
y
)
(
?
f
_
_
)
=>
apply
(
_
:
Proper
(
R
==>
R
==>
R
)
f
);
f_equiv
(
*
Next
,
try
to
infer
the
relation
.
Unfortunately
,
there
is
an
instance
of
Proper
for
(
eq
==>
_
),
which
will
always
be
matched
.
*
)
(
*
TODO
:
Can
we
exclude
that
instance
?
*
)
(
*
TODO
:
If
some
of
the
arguments
are
the
same
,
we
could
also
query
for
"pointwise_relation"
'
s
.
But
that
leads
to
a
combinatorial
explosion
about
which
arguments
are
and
which
are
not
the
same
.
*
)


?
R
(
?
f
?
x
)
(
?
f
_
)
=>
apply
(
_
:
Proper
(
_
==>
R
)
f
);
f_equiv


?
R
(
?
f
?
x
?
y
)
(
?
f
_
_
)
=>
apply
(
_
:
Proper
(
_
==>
_
==>
R
)
f
);
f_equiv
(
*
In
case
the
function
symbol
differs
,
but
the
arguments
are
the
same
,
maybe
we
have
a
pointwise_relation
in
our
context
.
*
)

H
:
pointwise_relation
_
?
R
?
f
?
g

?
R
(
?
f
?
x
)
(
?
g
?
x
)
=>
apply
H
;
f_equiv
end
.
(
**
solve_proper
solves
goals
of
the
form
"Proper (R1 ==> R2)"
,
for
any
number
of
relations
.
All
the
actual
work
is
done
by
f_equiv
;
...
...
@@ 277,9 +276,9 @@ Ltac solve_proper :=
(
*
Introduce
everything
*
)
intros
;
repeat
lazymatch
goal
with


Proper
_
_
=>
intros
???


(
_
==>
_
)
%
signature
_
_
=>
intros
???
end
;


Proper
_
_
=>
intros
???


(
_
==>
_
)
%
signature
_
_
=>
intros
???
end
;
(
*
Unfold
the
head
symbol
,
which
is
the
one
we
are
proving
a
new
property
about
*
)
lazymatch
goal
with


?
R
(
?
f
_
_
_
_
_
_
_
_
)
(
?
f
_
_
_
_
_
_
_
_
)
=>
unfold
f
...
...
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