coq


Why is it impossible to perform induction on a term that is used in conclusion?


Suppose the following particular scenario.
We have a definition of equality:
Inductive eqwal {A : Type} (x : A) : A -> Prop :=
eqw_refl : eqwal x x.
And peano nats:
Inductive nawt : Prop :=
| zewro : nawt
| sawc : nawt -> nawt.
We define addition on nats:
Fixpoint plaws (m n : nawt) : nawt :=
match m with
| zewro => n
| sawc m' => sawc (plaws m' n)
end.
And now we want to prove that zero is neutral from right wrt. summing:
Theorem neutral_r : forall n : nawt, eqwal (plaws n zewro) n.
Sadly the last line of the following proofscripts says "Error: n is used in conclusion.".
Proof.
intros.
induction n. - this is the culprit
There is not much about the error in official documentation and I am somewhat confused - why does this error occur?
Using the standard library, I can prove the theorem easily:
Theorem neutral_r : forall n : nat,
n + 0 = n.
Proof.
induction n; try reflexivity.
cbn; rewrite IHn; reflexivity.
Qed.
The problem is that you defined nawt with sort Prop instead of Type or Set. By default, the induction principles generated for propositions do not allow us to prove anything about proofs of those propositions. Consider the default induction principle generated for nawt:
Check nawt_ind.
> nawt_ind : forall P : Prop, P -> (nawt -> P -> P) -> nawt -> P
Because nawt_ind quantifies over Prop, and not over nat -> Prop, we cannot use it to prove your goal.
The solution is to set a few options that change Coq's default behavior, as in the following script.
Inductive eqwal {A : Type} (x : A) : A -> Prop :=
eqw_refl : eqwal x x.
Unset Elimination Schemes.
Inductive nawt : Prop :=
| zewro : nawt
| sawc : nawt -> nawt.
Scheme nawt_ind := Induction for nawt Sort Prop.
Set Elimination Schemes.
Fixpoint plaws (m n : nawt) : nawt :=
match m with
| zewro => n
| sawc m' => sawc (plaws m' n)
end.
Theorem eqwal_sym {A : Type} (x y : A) : eqwal x y -> eqwal y x.
Proof. intros H. destruct H. constructor. Qed.
Theorem neutral_r : forall n : nawt, eqwal (plaws n zewro) n.
Proof.
intros. induction n as [|n IH]; simpl.
- constructor.
- apply eqwal_sym in IH. destruct IH. constructor.
Qed.
The Elimination Schemes option causes Coq to automatically generate induction principles for data types and propositions. In this script, I merely turned it off, and used the Scheme command to generate the correct induction principle for nawt. For the induction tactic to work, it is important to give this principle the name nawt_ind: this is the default name that is generated by Coq, and is the one that induction looks for when called.
That being said, I would generally advise against defining a type of natural numbers in Prop instead of Type, because Coq imposes restrictions on how you can use things that live in Prop. For instance, it is impossible to show that zewro is different from sawc zewro.

Related Links

Inversion on large types with impredicative-set enabled
How does the discriminate tactic work?
Smart modification of Coq environment
Lexicographical comparison of tuples of nats
Multiple Where-clauses for Reserved Notation in Coq?
Writing well-founded programs in Coq using Fix or Program Fixpoint
Pigeonhole proof without decidable equality or excluded middle
Can I use a notation for an Inductive type to define that type in Coq?
Applying apply tactic to premises instead of the goal
Coq Real numbers -lexing and parsing 3.14
Supplying section arguments for examples
Definition function without using a helper function
Coquelicot library for basic undergraduate calculus
How to introduce n distinct symbols in Coq
How to install Coq
Agda-like programming in Coq/Proof General?

Categories

HOME
cakephp
multithreading
gerrit
proxy
keycloak
keras
zeromq
server
google-play
angular-material
sqlite-net-extensions
v8
cross-browser
flyway4
indesign
adfs
amazon-cloudformation
awesome-wm
communication
modelica
jqwidget
amazonsellercentral
abi
core-text
language-agnostic
jndi
opennlp
internet-explorer-9
virtualdub
phpfox
greendao
fluentvalidation
neo4j-spatial
large-file-upload
c++-amp
procdump
gsmcomm
bluestacks
xquery-3.0
siesta-swift
kendo-ui-grid
mpmediaquery
hexo
host
starteam
xenforo
dism
janrain
google-datalayer
appcompat
rails-routing
brightcove
carrot
forever
libusb-win32
memory-alignment
sqldf
dwscript
crosswalk-runtime
topbeat
sts-springsourcetoolsuite
login-control
qpid
firebaseui
gridview-sorting
hover-over
dataview
associative-array
r-tree
method-parameters
generic-programming
remobjects
skos
inmobi
formatjs
offloading
coldbox
winddk
seaside
braille
android-2.2-froyo
mbr
openlaszlo
intentservice
pyhdf
xsockets.net
dexterity
jplaton
ora-00911
back-stack
android-hardware
tinn-r
frameset
pysimplesoap
newtonscript
assembly-loading
subscript
adk
whoosh
nsobject
disclosure
gdlib
lpeg
site.master
fluent-interface
asp.net-profiles
audio-capture

Resources

Database Users
RDBMS discuss
Database Dev&Adm
javascript
java
csharp
php
android
javascript
java
csharp
php
python
android
jquery
ruby
ios
html
Mobile App
Mobile App
Mobile App