Skip to Content.
Sympa Menu

coq-club - Re:[Coq-Club]

coq-club AT inria.fr

Subject: The Coq mailing list

List archive

Re:[Coq-Club]


Chronological Thread 
  • From: Maximilian Wuttke <s8mawutt AT stud.uni-saarland.de>
  • To: coq-club AT inria.fr
  • Subject: Re:[Coq-Club]
  • Date: Sun, 31 Mar 2019 15:11:54 +0200
  • Authentication-results: mail2-smtp-roc.national.inria.fr; spf=None smtp.pra=s8mawutt AT stud.uni-saarland.de; spf=None smtp.mailfrom=s8mawutt AT stud.uni-saarland.de; spf=None smtp.helo=postmaster AT triton.rz.uni-saarland.de
  • Autocrypt: addr=s8mawutt AT stud.uni-saarland.de; prefer-encrypt=mutual; keydata= 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
  • Ironport-phdr: 9a23:kbq4dRFVvW2Q9YVJLKzTTp1GYnF86YWxBRYc798ds5kLTJ7zpciwAkXT6L1XgUPTWs2DsrQY0rKQ4vqrBzdIyK3CmUhKSIZLWR4BhJdetC0bK+nBN3fGKuX3ZTcxBsVIWQwt1Xi6NU9IBJS2PAWK8TW94jEIBxrwKxd+KPjrFY7OlcS30P2594HObwlSizexfK9+IA+yoAnPucUbgIVvIbstxxXUpXdFZ/5Yzn5yK1KJmBb86Maw/Jp9/ClVpvks6c1OX7jkcqohVbBXAygoPG4z5M3wqBnMVhCP6WcGUmUXiRVHHQ7I5wznU5jrsyv6su192DSGPcDzULs5Vyiu47ttRRT1jioMKjw3/3zNisFokaxVvhyhqRx8zYDabo6aO/hxcb/GcNMVWWZMRMFfWzBPD46+aYYEEuoPPfxfr4n4v1YAqgGxBAatBOPqyz9Ign720rc80+88EQ7GwRAgH84NsHvKsd74M7wSXOOwzKbSwzTDcu9W2Svm5YjTbhAhvOyDUahtccrXyEkjDhjFgU+Kpoz/OzOazOINvHWB4+V9S+2ikmgqoBx/rDiow8cjkIjJhoQNx1/e6yV22p01JcGiREFnZt6kFZ1dvDyZOYtuWs4uXm9ltSkgxrACuJO3ZioHxI45yxPfc/CLboaF7x35WOuVIDp0nnNodbylixqs7UStyOvxXdSu3llQtCpKiNzMu2gN1xPN7siHTeNw/lu72TaOywDT7edELVoulavaMZIh37gwlpsKvUTYBCD5gl/2jKuMeUUi5+ek8fnobav+qp+dMY97lB3+P7wzlsGxDuk0KAwDUmmB9em+zrHv4030TK1PjvIsk6nZtJ7aJd4cpq68GwJVyYUu6xOlADaozdQYgWUHIUleeBKbkojmJkvCIO3+Dfe+mlisiy1kyOrcPr3lGJrNKGXMnK38crlj80Jc0hY8zchD55JIDbEMOO78WkjotNDBEhA5NxG0zP38BdVm1oIeXHqPDbWDPKPTt1+I/OMvLPOWaI8bojauY8QisvXplDoynUIXVaivx5oeLn6iTdp8JEDMRHP8g9IAFWYDuEIBUfD2i1DKBSUDYn+tQr4gzionFY7gEIHCA5ukiaaF1SG3WJFbMDMVQmuQGGvlIt3XE8wHbzifd5c4w240EIO5Qopk7imA8Qrzyr5pNO3RoHdKro7+2J5o4eyWjhg77zh9Ccjb32zfFzgozFNNfCc/2eVEmWI40k2Ki/IqmOBFGZpO4fIMSQ4zL5rVyeA8B92gAlucLOfMc06vR5CdOR90Tt81xIVRMVpnGsmliFbZzWy3Bb5QjLWCHpg99K6a03Wjf8s=
  • Openpgp: preference=signencrypt

In the code, you use syntactic suggar for `match`. Actually, you do two
matches: in the first match, you match for the head-constructor of the
list. In the cons case, you do a second match on the tail. After this,
Coq doesn't know that `(consq _ x2 y)` is "smaller" than the original
list, because it doesn't know that `(consq _ x2 y)` is tail of the
original list. This is why Coq complains about ungarded recursion. What
you want to do is to call `last` on the "syntactical" tail of the
recursive list. We use two nested `match`s to do this:

```
Fail Fixpoint last (A:Set) (s:queue A) {struct s} :
(not (eq s (nilq A))) -> A:=
match s with
| nilq _ => (fun p =>
(False_elim A (p (eq_refl _))))
| consq _ x s' =>
match s' with
| nilq _ => (fun p => x)
| (consq _ x2 y) => (fun p => @last A s' _)
end
end.
(* Cannot infer this placeholder of type
"s' <> nilq A" in environment:
last : forall (A : Set) (s : queue A), s <> nilq A -> A
A : Set
s : queue A
x : A
s' : queue A
x2 : A
y : queue A
p : consq A x (consq A x2 y) <> nilq A
*)
```

We called `last` on `s'` and Coq knows that `s'` is the tail of the
original list `s`. So the problem of ungarded recursion is solved now.
However, we can't solve the obligation any more. To fix this, we use the
"convoy pattern" once more, and essentially do what the ltac `destruct
s' as [ | x2 s'']` would do:

```
Theorem not_eq_consq_nilq' (A:Set)(x:A) (s:queue A) (y:queue A) :
eq s (consq A x y) ->
not (eq s (nilq A)).
intro.
Proof.
congruence.
Qed.

Fixpoint last (A:Set) (s:queue A) {struct s} :
(not (eq s (nilq A))) -> A:=
match s with
| nilq _ => (fun p =>
(False_elim A (p (eq_refl _))))
| consq _ x s' =>
match s' as s0' return (s' = s0' -> _) with
| nilq _ => (fun p p' => x)
| (consq _ x2 s'') =>
(fun Eqn p => @last A s' (@not_eq_consq_nilq' A x2 s' s'' Eqn))
end eq_refl
end.

Compute @last _ (consq _ 4 (consq _ 8 (consq _ 15 (consq _ 16 (consq _
23 (consq _ 42 (nilq _))))))) _.
(* computes 42 *)
```

In the second `match` case, you now get a hypothesis `Eqn : s' = consq A
x2 s'`. This can be used to prove `s' <> nil`. I hope that helped.

Sincerely
Maximilian


On 28/03/2019 23:49,
psperatto AT gmail.com
wrote:
>  
>
> I have defined a set of queues of type A
> and other functions as follows:
>
>  
>
> Inductive queue (A:Set):Set :=
> | nilq  : queue A
> | consq : A-> queue A-> queue A.
>
>  
>
> Fixpoint ins_back (A:Set)(a:A)(s:queue A):
> (queue A):=
> match s with
> | nilq _ => consq _ a (nilq _)
> | consq _ x y => consq _ x (ins_back _ a y)
> end.
>
>  
>
> Theorem False_elim (A:Set)(f:False):A.
> elim f.
> Qed.
>
> Fixpoint set_queue (A:Set)(s:queue A): Prop:=
> match s with
> | nilq _ => False
> | consq _ x y => True
> end.
>
>
> Theorem eq_subst (A:Set)(x y :A)(P:A->Prop)
> (e:(eq x y))(i:(P y)) : P x.
> rewrite -> e.
> exact i.
> Qed.
>
>  
>
> Theorem not_eq_consq_nilq (A:Set)(x:A)
> (y:queue A): not (eq (consq A x y)(nilq A)).
> intro.
> exact (eq_subst (queue A) (nilq A)
>       (consq A x y)(set_queue A)
>        (eq_sym H) I).
> Qed.
>
>  
>
> I want to define a recursive function that
> computes the last element on a non-empty
> queue.
>
> To this end I've defined:
>
>  
>
> Fixpoint last (A:Set)(s:queue A):
> (not (eq s (nilq A))) -> A:=
> match s with
> | nilq _ => (fun p =>
> (False_elim A (p (eq_refl _))))
> | consq _ x (nilq _) => (fun p => x)
> | consq _ x (consq _ x2 y) =>
> (fun p => last _ (consq _ x2 y)
> (not_eq_consq_nilq _ x2 y))
> end.
>
>  
>
> I get the message:
> Cannot guess decreasing argument of fix.
>
>  
>
> I don't understand how is defined the order
> relation in Fixpoint definitions. The
> recursive call is in a smaller argument.
>
>  
>
> Someone can help me ???
>
> Regards,
> Patricia
>
>  
>
>
>
> ------------------------------------------------------------------------
> Avast logo <https://www.avast.com/antivirus>
>
> El software de antivirus Avast ha analizado este correo electrónico en
> busca de virus.
> www.avast.com <https://www.avast.com/antivirus>
>
>
> <#DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2>

Attachment: signature.asc
Description: OpenPGP digital signature



  • [Coq-Club], psperatto, 03/28/2019
    • Re:[Coq-Club], Maximilian Wuttke, 03/31/2019

Archive powered by MHonArc 2.6.18.

Top of Page