coq


Coq rewriting using lambda arguments


We have a function that inserts an element into a specific index of a list.
Fixpoint inject_into {A} (x : A) (l : list A) (n : nat) : option (list A) :=
match n, l with
| 0, _ => Some (x :: l)
| S k, [] => None
| S k, h :: t => let kwa := inject_into x t k
in match kwa with
| None => None
| Some l' => Some (h :: l')
end
end.
The following property of the aforementioned function is of relevance to the problem (proof omitted, straightforward induction on l with n not being fixed):
Theorem inject_correct_index : forall A x (l : list A) n,
n <= length l -> exists l', inject_into x l n = Some l'.
And we have a computational definition of permutations, with iota k being a list of nats [0...k]:
Fixpoint permute {A} (l : list A) : list (list A) :=
match l with
| [] => [[]]
| h :: t => flat_map (
fun x => map (
fun y => match inject_into h x y with
| None => []
| Some permutations => permutations
end
) (iota (length t))) (permute t)
end.
The theorem we're trying to prove:
Theorem num_permutations : forall A (l : list A) k,
length l = k -> length (permute l) = factorial k.
By induction on l we can (eventually) get to following goal: length (permute (a :: l)) = S (length l) * length (permute l). If we now simply cbn, the resulting goal is stated as follows:
length
(flat_map
(fun x : list A =>
map
(fun y : nat =>
match inject_into a x y with
| Some permutations => permutations
| None => []
end) (iota (length l))) (permute l)) =
length (permute l) + length l * length (permute l)
Here I would like to proceed by destruct (inject_into a x y), which is impossible considering x and y are lambda arguments. Please note that we will never get the None branch as a result of the lemma inject_correct_index.
How does one proceed from this proof state? (Please do note that I am not trying to simply complete the proof of the theorem, that's completely irrelevant.)
There is a way to rewrite under binders: the setoid_rewrite tactic (see §27.3.1 of the Coq Reference manual).
However, direct rewriting under lambdas is not possible without assuming an axiom as powerful as the axiom of functional extensionality (functional_extensionality).
Otherwise, we could have proved:
(* classical example *)
Goal (fun n => n + 0) = (fun n => n).
Fail setoid_rewrite <- plus_n_O.
Abort.
See here for more detail.
Nevertheless, if you are willing to accept such axiom, then you can use the approach described by Matthieu Sozeau in this Coq Club post to rewrite under lambdas like so:
Require Import Coq.Logic.FunctionalExtensionality.
Require Import Coq.Setoids.Setoid.
Require Import Coq.Classes.Morphisms.
Generalizable All Variables.
Instance pointwise_eq_ext {A B : Type} `(sb : subrelation B RB eq)
: subrelation (pointwise_relation A RB) eq.
Proof. intros f g Hfg. apply functional_extensionality. intro x; apply sb, (Hfg x). Qed.
Goal (fun n => n + 0) = (fun n => n).
setoid_rewrite <- plus_n_O.
reflexivity.
Qed.

Related Links

Coq proof tactics
Proof General's cursor is covering up my code when used in the terminal
Ltac not working after upgrading to Coq 8.5
Does ssreflect assume excluded middle?
Equality in COQ for enumerated types
Using “rewrite [hypothesis with implication]”
Confused by Coq imports
Behaviour of the apply tactic when the goal and the applied term match
Is there a ring or field tactic that can solve existential variables in Coq?
Proof by case analysis in Coq
How to let COQ write complete proof log?
How to compile Logic.v in Coq
is there a `eapply`-like tactic that works on `exists` goals in Coq?
rewrite works for = but not for <-> (iff) in Coq
Passing patterns to tactics
How to automatically introduce symmetries into Coq hypotheses?

Categories

HOME
google-chrome-extension
gitlab
amazon-ec2
ngrx
pycharm
iot
android-4.4-kitkat
graphql
networkx
iggrid
node-pdfkit
user-input
google-apps-marketplace
visual-studio-cordova
iolanguage
serverless-framework
progressive-web-apps
pc
ef-migrations
facebook-page
pugjs
evopdf
karma-jasmine
alpine
visual-composer
emulator
format-specifiers
firebase-crash-reporting
nhapi
c++-amp
binary-data
pdb
copying
android-kernel
devextreme
dartium
x11-forwarding
mixture-model
awt
eclipse-scout
ruby-on-rails-3.1
eclipse-gef
strptime
revapi
boost-multi-index
domain-model
integrity
composite-key
flutterwave
dwscript
watchconnectivity
jquery-filter
grails-tomcat-plugin
rotativa
radtreelist
nsfilemanager
multiple-regression
fadeout
qtableview
django-unittest
feedback
method-parameters
facebook-graph-api-v2.4
tween
c3
qpainter
javafx-webengine
device-manager
code-access-security
uitouch
pyhdf
quantlib-swig
ruby-datamapper
jplaton
mylyn
seed
nsnetservice
cascalog
viewswitcher
reddot
netbeans-6.9
work-stealing
data-loss
joyent
xtype
krl
lpeg
gamequery
uimenucontroller
nerddinner

Resources

Mobile Apps Dev
Database Users
javascript
java
csharp
php
android
MS Developer
developer works
python
ios
c
html
jquery
RDBMS discuss
Cloud Virtualization
Database Dev&Adm
javascript
java
csharp
php
python
android
jquery
ruby
ios
html
Mobile App
Mobile App
Mobile App