Skip to Content.
Sympa Menu

coq-club - Re: [Coq-Club] run recursive programs in coq

coq-club AT inria.fr

Subject: The Coq mailing list

List archive

Re: [Coq-Club] run recursive programs in coq


Chronological Thread 
  • From: Daniel Schepler <dschepler AT gmail.com>
  • To: Coq Club <coq-club AT inria.fr>
  • Subject: Re: [Coq-Club] run recursive programs in coq
  • Date: Thu, 1 Nov 2018 10:25:05 -0700
  • Authentication-results: mail3-smtp-sop.national.inria.fr; spf=None smtp.pra=dschepler AT gmail.com; spf=Pass smtp.mailfrom=dschepler AT gmail.com; spf=None smtp.helo=postmaster AT mail-ot1-f46.google.com
  • Ironport-phdr: 9a23:EJetXhQ+UF8ZtKBi1Eizg8hQSdpsv+yvbD5Q0YIujvd0So/mwa69YB2N2/xhgRfzUJnB7Loc0qyK6/+mATRIyK3CmUhKSIZLWR4BhJdetC0bK+nBN3fGKuX3ZTcxBsVIWQwt1Xi6NU9IBJS2PAWK8TW94jEIBxrwKxd+KPjrFY7OlcS30P2594HObwlSizexfbF/IA+qoQnNq8IbnZZsJqEtxxXTv3BGYf5WxWRmJVKSmxbz+MK994N9/ipTpvws6ddOXb31cKokQ7NYCi8mM30u683wqRbDVwqP6WACXWgQjxFFHhLK7BD+Xpf2ryv6qu9w0zSUMMHqUbw5Xymp4rx1QxH0ligIKz858HnWisNuiqJbvAmhrAF7z4LNfY2ZKOZycqbbcNgHR2ROQ9xRWjRODYOybYQBD+QPM+VFoYfju1QDtge+CRW2Ce/z1jNEmn370Ksn2OohCwHG2wkgEsoAvnvOqtX1NbkdUeSox6fV0TrDb+1Z2S/56IfWaBAqvPaBUq9rccXNyUkgCRvFjlGOpoz/JD6V2eENvHKa7+pkT+6gl2knqwRorzWp28wiiZHJi5oLxlzY8Sh12oU4KN2iREJlfNKoDIFcui6bOoZwX8gsWXtnuDwgxb0DoZO7fDYFyJAgxxPHbvyIaYmI4hb6WOaWPTd0mWtpeLywihuz60Sgxer8Vs670FZOsCVJiMXDtncI1xDL68iHTOVy/lu51DqRywze7vtILEM0mKbBNZIt36I8moAcvEnCBiP2nV/5jK6SdkUq4Oio7OHnb637qZ+HK4B0ih/xMrwqmsOhG+Q1KQcOX22B9uS90L3v51H2QLJPjvEuiKnWrIjaJdgHpq6+GwJazoEj6w+mAzi61NQYgGIIIUleeBOHiojpI0vBLOr5Dfe5mVSskS1ky+rIPr37Ud3xKS3ol66pVrJg4QYIww0qiNtb+ph8C7cbIfu1VFWn5/LCCRpsHwWywuvjQO521o4GXW+VSvuVK6jSvEeM6/gHLOyFZYtTszH4fat2r8XyhGM0zAdONZKi2oEaPTXhRqw/chepJEH0i9JEKl8k+w83TejkklqHCGcBaHO7XqZ67TY+Wtv/UdXzA7u1ibnE5x+VW4VMbzkfWF+JGHbsMY6DXqVUMX/AEopaijUBEIOZZcoh2BWp7lKozrNmKq/T5nRdu869ktdy4OLXmFc58jkmV8k=

On Thu, Nov 1, 2018 at 9:35 AM Li-yao Xia
<lysxia AT gmail.com>
wrote:
>
> If you're using fuel it is fairly easy to make it structurally
> decreasing with a simple Fixpoint because fuel can just decrease by 1,
> instead of using a Program and proving decreasingness with respect to lt.

Or, to put a bit of monad-type synactic sugar around it:

Definition fuelled (X : Type) : Type :=
nat -> option X.

Definition return_ {X : Type} (x : X) : fuelled X :=
fun _ => Some x.

Definition bind {X : Type} (x : fuelled X)
{Y : Type} (f : X -> fuelled Y) :
fuelled Y :=
fun fuel => match x fuel with
| Some x0 => match f x0 fuel with
| Some y0 => Some y0
| None => None
end
| None => None
end.

Notation "'do' x0 <- x ; y" := (bind x (fun x0 => y))
(x0 ident, at level 20, right associativity).

Definition recursive_call {X:Type} (x : fuelled X) :
fuelled X :=
fun fuel => match fuel with
| S fuel_pred => x fuel_pred
| O => None
end.

Definition ackermann_fuel : nat -> nat -> fuelled nat :=
fix F (m n:nat) (fuel : nat) {struct fuel} : option nat :=
match m with
| O => return_ (S n)
| S m' => match n with
| O => recursive_call (F m' 1)
| S n' =>
do x <- recursive_call (F m n');
recursive_call (F m' x)
end
end fuel.

Definition run_with_fuel {X:Type} (x : fuelled X)
(fuel : nat) :=
x fuel.

Compute (run_with_fuel (ackermann_fuel 3 3) 100)
--
Daniel Schepler



Archive powered by MHonArc 2.6.18.

Top of Page