coq-club AT inria.fr
Subject: The Coq mailing list
List archive
- From: Agnishom Chattopadhyay <agnishom AT cmi.ac.in>
- To: coq-club AT inria.fr
- Subject: [Coq-Club] How do I convince Coq that my recursion is guarded?
- Date: Sat, 8 Feb 2020 09:52:20 -0600
- Authentication-results: mail2-smtp-roc.national.inria.fr; spf=None smtp.pra=agnishom AT cmi.ac.in; spf=Pass smtp.mailfrom=agnishom AT cmi.ac.in; spf=None smtp.helo=postmaster AT mail.cmi.ac.in
- Ironport-phdr: 9a23:XoSu5xHCz9V8r/lyqBOnSJ1GYnF86YWxBRYc798ds5kLTJ78oMywAkXT6L1XgUPTWs2DsrQY0raQ7v+rCTVIoc7Y9ixbK9oUD15NoP5VtjRoONSCB0z/IayiRA0BN+MGamVY+WqmO1NeAsf0ag6aiHSz6TkPBke3blItdaz6FYHIksu4yf259YHNbAVUnjq9Zq55IAmroQnLucQanIRvJrwxxxbLrXdFePlazn5sKV6Pghrw/Mi98INt/ihKp/4t68tMWrjmcqolSrBVEC4oOH0v6s3xshnDQwqP5n8CXWgTjxFFHQvL4gzkU5noqif1ufZz1yecPc3tULA7Qi+i4LtxSB/pkygIKTg0+3zKh8NqjaJbpBWhpwFjw4PRfYqYOuZycr/bcNgHQ2dKQ8RfWDFbAo6kYIQBD+QPM+VFoYfju1QDtgGxCRW2Ce711jNEmn370Ksn2OohCwHG2wkgEsoSvXTbqtX1NbwSUeCyzKnN0D7OcfNW1i3h6IjUdRAhueuDUq9wccvR00YuFx7Og1KKpozqOTOV1/8Ns2ic7+plTu+gl2snqwBrrje12sggkIjJhoQMx13C6C53w541KMWlREJlb9OoCppdui+AO4doXs8vTXtktDgnxrEYoZK3YjQGxZA9yxPca/GLaZWE7xPiWeqLPDt1hnBodbSijBio60eg0PfzVsys3VZKsCVFlt7Mu2gI1xPJ68iHTuFx8Vuk2TaOzQzc8P1LLVo1lardM5Ihw7gwmYQPsUnbAyP6hkv7gLWXe0gq4OSk9fjrb7v8qpOCKoN4lBnyMqE0lcy+BeQ4PBIOX2+e+emkzrLj8kv5QLRRjv02lanZtYvXKtgepq64GQNayJos5wy+DzegyNgYh2UILEpZeBKbiIjkI03BIPfhDfumn1uslCpryOvdM736ApTNK2DDn637cbZ87U5c0gszwspF65JaELFSaM70D0T2rZnTCgIzGw2y2efuTttnha0EXmfaK6CfMbjStlrAzeImP/WLfIYZuCf0OrBx7vHojGQ5nlo1dqyom5IcLnG+SKc1a36FaGbh149SWVwBuRAzGbSz1Q+yFAVLbnP3ZJoSozE2DIX/U9XGT4GpxreE3WGyFdtXYDIeUwzeITLTb4yBHsw0RmeKOMY4y24PULnnQoRn1Bf87FarmYoiFfLd/2gjjbym0dF04+PJkhRrrG5/CsXb2mrLTmcmx24=
I have the following definitions:
CoInductive Monitor (A: Type) : Type := {
mNext: A -> bool * (Monitor A);
}.
CoFixpoint MonOr {A: Type} (mon1 mon2: Monitor A) : Monitor A :=
{|
mNext (a : A) :=
let (b1, mon1) := (mNext mon1 a) in
let (b2, mon2) := (mNext mon2 a)
in (b1 || b2, MonOr mon1 mon2)
|}.
CoFixpoint MonDelayWith {A: Type} (init : bool) (mon : Monitor A) : Monitor A :=
{|
mNext (a : A) :=
let (b1, mon1) := (mNext mon a) in
(init, MonDelayWith b1 mon1)
|}.
Definition MonJustBefore {A: Type} : Monitor A -> Monitor A :=
MonDelayWith false.
mNext: A -> bool * (Monitor A);
}.
CoFixpoint MonOr {A: Type} (mon1 mon2: Monitor A) : Monitor A :=
{|
mNext (a : A) :=
let (b1, mon1) := (mNext mon1 a) in
let (b2, mon2) := (mNext mon2 a)
in (b1 || b2, MonOr mon1 mon2)
|}.
CoFixpoint MonDelayWith {A: Type} (init : bool) (mon : Monitor A) : Monitor A :=
{|
mNext (a : A) :=
let (b1, mon1) := (mNext mon a) in
(init, MonDelayWith b1 mon1)
|}.
Definition MonJustBefore {A: Type} : Monitor A -> Monitor A :=
MonDelayWith false.
Now, I want to define:
CoFixpoint MonSometime {A: Type} (mon : Monitor A) : Monitor A :=
MonOr mon (MonJustBefore (MonSometime mon)).
MonOr mon (MonJustBefore (MonSometime mon)).
but that does not seem to work. The definition intuitively seems to make sense. Also, if we unroll the definition of MonJustBefore, it appears (to me) that the recursive call is guarded within the mNext constructor in MonDelayWith. How do I make Coq believe this?
Another way to define the same thing would be:
CoFixpoint MonTrue (A: Type) : Monitor A := {|
mNext (a: A) := (true, MonTrue A)
|}.
mNext (a: A) := (true, MonTrue A)
|}.
CoFixpoint MonSometime {A: Type} (mon: Monitor A) : Monitor A.
{|
mNext (a : A) :=
let (b1, mon') := (mNext mon a) in
if b1 then (true, MonTrue) else (false, MonSometime mon')
|}.
{|
mNext (a : A) :=
let (b1, mon') := (mNext mon a) in
if b1 then (true, MonTrue) else (false, MonSometime mon')
|}.
But for some reason, this generates some proof obligation. Why is that?
And I cannot seem to be able to discharge it:
CoFixpoint MonAlways {A: Type} (mon: Monitor A) : Monitor A.
{|
mNext (a : A) :=
let (b1, mon') := (mNext mon a) in
if (~b1) then (false, MonFalse) else (true, MonAlways mon')
|}. exact mon. Defined.
{|
mNext (a : A) :=
let (b1, mon') := (mNext mon a) in
if (~b1) then (false, MonFalse) else (true, MonAlways mon')
|}. exact mon. Defined.
Any suggestions about the above would be appreciated.
--Agnishom
- [Coq-Club] How do I convince Coq that my recursion is guarded?, Agnishom Chattopadhyay, 02/08/2020
- Re: [Coq-Club] How do I convince Coq that my recursion is guarded?, Li-yao Xia, 02/08/2020
- Re: [Coq-Club] How do I convince Coq that my recursion is guarded?, Agnishom Chattopadhyay, 02/08/2020
- Re: [Coq-Club] How do I convince Coq that my recursion is guarded?, Li-yao Xia, 02/08/2020
- Re: [Coq-Club] How do I convince Coq that my recursion is guarded?, Agnishom Chattopadhyay, 02/08/2020
- Re: [Coq-Club] How do I convince Coq that my recursion is guarded?, Li-yao Xia, 02/08/2020
Archive powered by MHonArc 2.6.18.