coq-club AT inria.fr
Subject: The Coq mailing list
List archive
- From: Tj Barclay <tjbarclay AT ku.edu>
- To: <coq-club AT inria.fr>
- Subject: [Coq-Club] Program Fixpoint and Nested fix expressions
- Date: Mon, 14 Sep 2020 02:28:51 -0500
- Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 129.237.34.11) smtp.rcpttodomain=inria.fr smtp.mailfrom=ku.edu; dmarc=bestguesspass action=none header.from=ku.edu; dkim=none (message not signed); arc=none
- Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=3SP6K8lnd98yHJq44DczgNhgLNVzY0NYWAN099GOtpE=; b=cjdQ4ymNasGCFdzqcWhDJmImT+5dNZwo5WArHXcBCDGEbFx0NMTkYX70xgq7RjqblwyZvKzFTd9hOvN5Qr9XFsGyBNajNdC851QpAmdXs3JPHKRFuaWNkigcYGZtu656zUi632Z1SYXrZyVqF8Fytr3PxkAN/BsbuIqSDZ3DmCNnBV30esI6xutyj1tVRtLGJUtez2vFpqKQSFlp0+msaax4LabJB/MhqWC+gi2SQAVEvVcq67P2H/z3JcldtuMT/ALWZa2T+5cn5ywu0OmayP0c7a+Ey7+uvR5PaFVueOzk6+ebPocEPZKfHGlhTmdhmV/RB7CiTkOB+vnwyEN4ig==
- Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=IOvz/jc01idt+cXi40tcMs1gEvdEOfDMaydNQzpnsFBylSHeXwbv05QTClDMUlu5wyUE8+GglRXrOa7fuHIWWtOdHpGUYbOUXeMIzUjcRD8aTBQp1Vb7OwY2kcpQAxKqFK2YFpxSb7od2aU8Ms9HG8E7oC/wfr3eVwPJN37eBhMw02hWTS3irLTGoHl8UKPKgxvCHW06F5Csj+hZ37Ed9wG+pcbHcqRgoYnDGsmk6+0X/n/ls1GIPjO90xkzHdM7HEyXMVtPv2JuouCfPiFd4HBybUSL53w2g2SBPEZMOcYnReR8wvlh+Zj4khi1FVP1qDozfDEbcmh2yXez9j5nwQ==
- Authentication-results: mail3-smtp-sop.national.inria.fr; spf=None smtp.pra=tjbarclay AT ku.edu; spf=Pass smtp.mailfrom=tjbarclay AT ku.edu; spf=Pass smtp.helo=postmaster AT NAM04-SN1-obe.outbound.protection.outlook.com
- Ironport-phdr: 9a23:CYA8oxQr7Qp7NgzK65DCXdmQRNpsv+yvbD5Q0YIujvd0So/mwa6yYxON2/xhgRfzUJnB7Loc0qyK6v6mADZcqsbY+Fk5M7V0HycfjssXmwFySOWkMmbcaMDQUiohAc5ZX0Vk9XzoeWJcGcL5ekGA6ibqtW1aFRrwLxd6KfroEYDOkcu3y/qy+5rOaAlUmTaxe7x/IAi3oAnLq8Uan4RvJqkyxxfUv3BFZ/lYyWR0KFyJgh3y/N2w/Jlt8yRRv/Iu6ctNWrjkcqo7ULJVEi0oP3g668P3uxbDSxCP5mYHXWUNjhVIGQnF4wrkUZr3ryD3q/By2CiePc3xULA0RTGv5LplRRP0lCsKMSMy/WfKgcJyka1bugqsqBN/zYDaY4+bKeRwcb/cfd4BX2VNQtxcWjZdDo+gbYYCCfcKM+ZCr4n6olsDtQWwBQuxD+7y0DBInGP53akg3OUhDArL2xAgH9AVv3vOttX6KKMSXvq1zaTTzjXDcula1ing54jVax0sp+yHUr1sf8TL00YvCx/FgUuKqYzjJz6Y2eQAv3SH4udvS++ihGoqpxxyrzWh28shiIjEi4EXx13E9Sh0zog7KcG5RUNmf9KoDJteuiOEOoZ0XM4sTWNltSAnwbMIvp67eTIFyJUhxxPHc/yHaY+I4h35VOmLJDd0nnxkeLy5ih2v8kag0vXxW8ao3FpQsyZJjtvBumoP2hDP8MSLV+dx80W51TqSyQze7vtILV46mKfZMZIt37E9moAOvUnHGCL9hV/4g7WMdko+/+il8+Tnbavipp+bL4J6kh3zPKMylsGwGOg2LxAAU3WC9eS7z7Ls41f1QLJXjv0qiabZt43aJcIGqaKjGw9VyIEj6wqhADi6zNQYnH4HLFRfdBKAkojpJ1XOIPf/Dfe8mVijjDBrx/XeMr3gBJXCMGTDna/ucLph8UJQ1RY/wNJF659WFr0NOu//VlPzudDACx82KQ20w+LpCNVn0YMeXHqCArObMKzJq1CI/P4gI+2Wa44Vozv9KOUl6+TwgnAkhF8RZbOp0ocPaHCkAvRmJF2UbmbrgtcYCGsFog4+TPHxh1CZSj5SZ3OyX7om6T0hCYKmC53DRoG3j7Cb0ie7BM4eWmcTXluLCDLjc5iOc/YKciObZMF7xG8qT7+kHrMjnTunrgT+wqsvevbW8CQCvpbqxfB2+qvemQxkpm88NNiUz2zYFzI8pWgPXTJjhPkj83w48U+K1O1Du9IdDcZat6FKT0E3OYOOl7UrWeC3YRrIe5KycHjjR9ynBT8rSddhkdwTJUtxBof7102R72+RG7YQ0oezKtk0/6bbgyejAe9YkyqD7494yl4sT41IKHGsgbN5+07LHYnVnk6FlqGsM6MBwCrK82TFxm2L7hhV
Enclosed is an arbritrary example (Coq 8.11.2) of an attempt to show termination of a recursive function on the size of a nested-recursive datatype.
Is it possible for the obligation generated by the recursive call to 'flatten' inside the nested fix, 'flatten_list', to also generate hypotheses relating the matched list 'l' and the parameter 'arbs'? In particular, that 'arbs' will always be a sublist of 'l' or that the matched pair '(_,a')' has the property 'In (_,a') l'.
(* Example Start *)
Require Import Coq.Program.Wf.
Require Import List.
Import ListNotations.
Unset Elimination Schemes.
Inductive Forall' (A : Type) (P' : A -> Type) : list A -> Type :=
| Forall_nil' : Forall' A P' []
| Forall_cons' : forall (x : A) (l : list A), P' x -> Forall' A P' l -> Forall' A P' (x :: l).
Require Import List.
Import ListNotations.
Unset Elimination Schemes.
Inductive Forall' (A : Type) (P' : A -> Type) : list A -> Type :=
| Forall_nil' : Forall' A P' []
| Forall_cons' : forall (x : A) (l : list A), P' x -> Forall' A P' l -> Forall' A P' (x :: l).
Inductive arb : Type :=
| A : nat -> arb
| B : nat -> list (nat * arb) -> arb.
Definition arb_rect_helper (P : arb -> Type) (p : nat * arb) : Type :=
match p with
| (x, y) => P y
end.
Fixpoint arb_rect (P : arb -> Type)
(H1 : forall (n : nat), P (A n))
(H2 : forall (n : nat) (l : list (nat * arb)), Forall' (nat * arb) (arb_rect_helper P) l -> P (B n l))
(a : arb) : P a :=
match a return (P a) with
| A n => H1 n
| B n l => let fix loop (l : list (nat * arb)) :=
match l with
| [] => Forall_nil' (nat * arb) (arb_rect_helper P)
| (n',a')::l' => Forall_cons' (nat * arb) (arb_rect_helper P) (n',a') l' (arb_rect P H1 H2 a') (loop l')
end
in
H2 n l (loop l)
end.
Definition arb_rec (P : arb -> Set) := arb_rect P.
Definition arb_ind (P : arb -> Prop) := arb_rect P.
Set Eliminate Schemes.
Fixpoint size_arb (a : arb) : nat :=
match a with
| A _ => 1
| B _ l => 1 + (fix size_list (l : list (nat * arb)) : nat :=
match l with
| [] => 0
| (_,a')::l' => size_arb a' + size_list l'
end) l
end.
(* Function in question *)
Program Fixpoint flatten (a : arb) {measure (size_arb a)}: list nat :=
match a with
| A n => [n]
| B n l => n :: (fix flatten_list (arbs : list (nat * arb)) : list nat :=
match arbs with
| [] => []
| (n',a')::arbs' => n' :: (flatten a' ++ flatten_list arbs')
end) l
end.
Obligation 1.
match a with
| A n => [n]
| B n l => n :: (fix flatten_list (arbs : list (nat * arb)) : list nat :=
match arbs with
| [] => []
| (n',a')::arbs' => n' :: (flatten a' ++ flatten_list arbs')
end) l
end.
Obligation 1.
(* Example End *)
Best,
TJ
-- TJ Barclay
Electrcial Engineering & Computer Science, University of Kansas
+1 316 259 2250
- [Coq-Club] Program Fixpoint and Nested fix expressions, Tj Barclay, 09/14/2020
- Re: [Coq-Club] Program Fixpoint and Nested fix expressions, Castéran Pierre, 09/14/2020
- Re: [Coq-Club] Program Fixpoint and Nested fix expressions, Matthieu Sozeau, 09/14/2020
- Re: [Coq-Club] Program Fixpoint and Nested fix expressions, Dominique Larchey-Wendling, 09/14/2020
- Re: [Coq-Club] Program Fixpoint and Nested fix expressions, Christian Doczkal, 09/14/2020
- Re: [Coq-Club] Program Fixpoint and Nested fix expressions, Gert Smolka, 09/14/2020
- Re: [Coq-Club] Program Fixpoint and Nested fix expressions, Gert Smolka, 09/14/2020
- Re: [Coq-Club] Program Fixpoint and Nested fix expressions, Jim Fehrle, 09/14/2020
- Re: [Coq-Club] Program Fixpoint and Nested fix expressions, Christian Doczkal, 09/14/2020
- Re: [Coq-Club] Program Fixpoint and Nested fix expressions, Matthieu Sozeau, 09/15/2020
- Re: [Coq-Club] Program Fixpoint and Nested fix expressions, Dominique Larchey-Wendling, 09/15/2020
Archive powered by MHonArc 2.6.19+.