[Agda] Re: [Coq-Club] Need help with coinductive proof

Thorsten Altenkirch txa at Cs.Nott.AC.UK
Tue Aug 25 19:31:14 CEST 2009


Hi Edsko,

I am copying the Coq club back in - hope this is ok. I also cc it to  
the Agda list since I find it easier to answer the question in Agda  
(the background to the discussion can be found in the coq club archive).

> Suppose we have a function (count f) on streams which returns (f x1  
> + f x2 + ...); then we want to prove a lemma that
>
>  h . count f ~ count (h . f)
>
> for any morphism h (except of course that we don't want to prove  
> this for lists but prove it polytypically; for an informal statement  
> of this lemma, see Hinze's habilitationsschrift, http://www.iai.uni-bonn.de/~ralf/publications/habilitation.pdf 
> , p 102, Section 4.3.2).

It seems to me that to prove this you basically need to show that +  
preserves ~.

I implemented the relation I think you want to define in Agda using  
mixed induction/coinduction. First I define partial conatural numbers:

data CoNat' : Set where
   zero : CoNat'
   1+_ : ∞ CoNat' → CoNat'
   τ :  ∞ CoNat' → CoNat'

Here the recursive occurences marked with ∞ are coinductive. This is  
basically your type conat with the add constructor omitted. I call it  
CoNat' to make a difference to ordinary CoNat (without the τ ).

I define addition on partial coNaturals:

_+'_ : CoNat' → CoNat' → CoNat'
zero +' n = n
(1+ m) +' n = 1+ (♯ (♭ m) +' n)
(τ m) +' n = τ (♯ (♭ m) +' n)

To read this one has to know that ♭is "delay" and ♯ is "forcing".  
See our paper.

Instead of defining the equality directly I define a preorder  
corresponding to "more defined" (Agda allows to reuse constructors  
hence I use the same name for the congruences rules).

data _⊑_ :  CoNat' → CoNat' → Set where
   zero : zero ⊑ zero
   1+_ :  ∀ {m n} → ∞ (♭ m ⊑ ♭ n) → 1+ m ⊑ 1+ n
   τ :  ∀ {m n} → ∞ (♭ m ⊑ ♭ n) → τ m ⊑ τ n
   τl : ∀ {m n} → (♭ m ⊑ n) → τ m ⊑ n

This is a mixed inductive/coinductive definition, a see the paper  
which was already mentioned by Nisse:
http://www.cs.nott.ac.uk/~nad/publications/danielsson-altenkirch-mixing.html
The idea is that you can a less defined value may have a finite delay,  
hence here we use an inductive argument. However, we still need that  
1+ and τ are congruences and hence their arguments have to be  
coinductive.

It is straightforward to show that ⊑ is a preorder:

refl⊑ : ∀ {m} → m ⊑ m
refl⊑ {zero} = zero
refl⊑ {1+ n} = 1+ (♯ (refl⊑ {♭ n}))
refl⊑ {τ n} = τ (♯ (refl⊑ {♭ n}))

trans⊑ : ∀ {l m n} → l ⊑ m → m ⊑ n → l ⊑ n
trans⊑ zero zero = zero
trans⊑ (1+ p) (1+ q) = 1+ (♯ trans⊑ (♭ p) (♭ q))
trans⊑ (τ p) (τ q) = τ (♯ trans⊑ (♭ p) (♭ q))
trans⊑ (τ p) (τl q) = τl (trans⊑ (♭ p) q)
trans⊑ (τl p) q = τl (trans⊑ p q)

Also it is not hard to show that +'  preserves ⊑:

cong+' : ∀ {m m' n n'} → m ⊑ m' → n ⊑ n' → (m +' n) ⊑ (m'  
+' n')
cong+' zero q = q
cong+' (1+ p) q = 1+ (♯ cong+' (♭ p) q)
cong+' (τ p) q = τ ((♯ cong+' (♭ p) q))
cong+' (τl p) q = τl (cong+' p q)

The relation ~ I think you want to define is simply the symmetric  
closure of ⊑ (and hence an equivalence relation). And cong+' implies  
that ~ is a congruence wrt +' which is sufficent to prove your result  
I think.

It shouldn't be too hard to translate this into Coq - the mixed  
inductive/coinductive definition you have to replace with a nested  
coinductive - inductive definition. You may have to spend some time to  
derive the appropriate induction and coinduction principles because  
they are not generated automatically afaik.

Or use Agda... :-)

Cheers,
Thorsten

P.S. Here is the Agda file:















This message has been checked for viruses but the contents of an attachment
may still contain software viruses, which could damage your computer system:
you are advised to perform your own checks. Email communications with the
University of Nottingham may be monitored as permitted by UK legislation.

-------------- next part --------------
Skipped content of type multipart/mixed


More information about the Agda mailing list