[Agda] Proving properties about a datatype with a functional component

Martin Escardo m.escardo at cs.bham.ac.uk
Wed Sep 26 11:42:15 CEST 2018


If you abstract from your particular application, the type you are 
considering is that of countably branching trees with leaves in A, which 
arises also in many other applications, either literally or in the form 
of a variation (e.g. labels also in the internal nodes).

One often can get away by considering the relation f ~ g on functions 
defined by f x = g x for all x. The price to pay is that it is not 
automatic that in this case P f -> P g for an arbitrary property P. But 
you will be able to prove this in many specific examples of P that arise 
in your work (I have used this often).

In this way you can get away without function extensionality in many 
cases. However, this doesn't always work or, even when it works, can be 
very inconvenient and "nonmodular".

HoTT/UF is an extension of dependent type theories which addresses 
precisely the problem of extensionality of equality (not only for 
functions, but more generally for types, in the form of univalence).

You can either consistently postulate functional extensionality (but you 
will lose computational content sometimes), or else try the new "Cubical 
Agda", which has extensionality that computes. Unfortunately, at the 
moment this is not very well documented, as it is fairly recent work, 
and hence only the experts know how to use it.

https://agda.readthedocs.io/en/latest/language/cubical.html

Chuangjie Xu has an example of a computation that gets stuck with 
function extensionality, producing a fairly large term (I think 300 
lines), but that computes the number zero when rendered in Cubical Agda.

http://www.cs.bham.ac.uk/~mhe/chuangjie-xu-thesis-cubical/html/index.html

The experiment that computes zero (the modulus of uniform continuity of 
a constant function) is here

http://www.cs.bham.ac.uk/~mhe/chuangjie-xu-thesis-cubical/html/UsingFunext.ModellingUC.ComputationExperiments.html

Martin

On 26/09/18 10:18, scm at iis.sinica.edu.tw wrote:
> Hi,
> 
> This is a question that might be related to extensional equality,
> and perhaps more. I believe that similar questions must have been
> raised in other contexts, but I cannot not find solutions that
> work in this case, and therefore decided to pose the question to
> the list.
> 
> In a simplified form, a "responsive computation" of type A is
> either a value of type A, or a function that takes a signal
> from the environment (for example, a Nat, indicating perhaps the
> current time) and returns a responsive computation. This can
> be modelled by the datatype:
> 
>    data RComp (A : Set) : Set where
>      V : A → RComp A
>      R : (ℕ → RComp A) → RComp A
> 
> I wish to prove various operations on RComp, as well as
> proving their properties. For example, we can define an
> "fmap" function for RComp:
> 
>    fmap : {A B : Set} → (A → B) → RComp A → RComp B
>    fmap f (V x) = V (f x)
>    fmap f (R k) = R (fmap f ∘ k)
> 
> (The definition passes termination check in Agda 2.5.4.1,
> but not in, say, 2.5.2.)
> 
> One of the things I wish I can do is to prove that fmap
> is indeed a functorial map. For example, we shall have,
> for all x, fmap id x = x:
> 
>    functor1 : ∀ {A} (x : RComp A) → fmap id x ≡ x
>    functor1 (V x) = refl
>    functor1 (R k) = ?   -- goal: R (fmap id ∘ k) = R k
> 
> The base case (V x) is immediate. For the inductive case,
> we need to prove
> 
>    R (fmap id ∘ k) = R k
> 
> One might try either:
>    
>    functor1 (R k) = cong R ?                 -- goal: (fmap id ∘ k) ≡ k
>    functor1 (R k) = cong (λ g → R (g ∘ k)) ? -- goal: fmap id ≡ id
> 
> Either way, extensional equality seems to start being
> involved.
> 
> I am not sure about the consequences if I postulate
> extensionality. Anyway, if I do:
> 
>    postulate
>      extensionality :
>       {A B : Set} {f g : A → B} → (∀ x → f x ≡ g x) → f ≡ g
> 
> I can get the following to type check (where extensionality
> is used to convert the recursive call to fmap id ≡ id),
> 
>    functor1 : ∀ {A} (x : RComp A) → fmap id x ≡ x
>    functor1 (V x) = refl
>    functor1 {A} (R k) = cong (λ g → R (g ∘ k)) ext
>      where ext : fmap {A} {A} id ≡ id
>            ext = extensionality (functor1 {A})
> 
> but this fails termination check.
> 
> My question is: how would you formulate this scenario
> and prove the property above?
> 
> * Is it okay to postulate extensional equality?
>    I read about some consequences, including losing
>    canonicity, etc. Does that matter to what I want
>    to prove, if they are mostly like the functorial
>    property above?
> 
> * To get around the termination check, is it a
>    wrong idea to formulate RComp as an inductive type?
>    Do I need coinductive type, or the delay monad, or..?
> 
> Thank you!
> 
> (some test code is attached below)
> 
> sincerely,
> Shin
> scm at iis.sinica.edu.tw
> 
> 
> -----
> 
> module RComp where
> 
> open import Data.Nat  -- only as an example
> open import Relation.Binary.PropositionalEquality
> 
> data RComp (A : Set) : Set where
>    V : A → RComp A
>    R : (ℕ → RComp A) → RComp A
> 
> _∘_ : {A B C : Set} → (B → C) → (A → B) → A → C
> (f ∘ g) x = f (g x)
> 
> fmap : {A B : Set} → (A → B) → RComp A → RComp B
> fmap f (V x) = V (f x)
> fmap f (R k) = R (fmap f ∘ k)
> 
> id : {A : Set} → A → A
> id x = x
> 
> postulate
>    extensionality :
>     {A B : Set} {f g : A → B} → (∀ x → f x ≡ g x) → f ≡ g
> 
> {-# TERMINATING #-}  -- the following fails termination check
> functor1 : ∀ {A} (x : RComp A) → fmap id x ≡ x
> functor1 (V x) = refl
> functor1 {A} (R k) = cong (λ g → R (g ∘ k)) ext
>    where ext : fmap {A} {A} id ≡ id
>          ext = extensionality (functor1 {A})
> 
> _______________________________________________
> Agda mailing list
> Agda at lists.chalmers.se
> https://lists.chalmers.se/mailman/listinfo/agda
> 

-- 
Martin Escardo
http://www.cs.bham.ac.uk/~mhe


More information about the Agda mailing list