[Agda] Agda with the excluded middle is inconsistent ?

Thorsten Altenkirch txa at Cs.Nott.AC.UK
Wed Jan 13 20:22:25 CET 2010


> I agree we are in desperate need for a practical semantics for  
> inductive families.

Not sure what practical means but what is the problem with the one in  
our LICS paper?
http://www.cs.nott.ac.uk/~txa/publ/ICont.pdf

>
> With regard to what the criteria should be for legal data types or  
> legal injective data types, I did not fully understand your  
> proposal.  The reason why parameters to data types (as opposed to  
> indices) can be arbitrarily large is that in a "Section" (Coq- 
> terminology) with
>
>  Hypothesis X : very_large_type.
>
>  data List : Set where
>    ...
>
> one can close the section and abstract over all hypotheses,  
> including X, which will be added as a parameter to List:
>
>  data List (X : very_large_type) : Set
>
> Thus, example J is not accepted by accident.  The ability to  
> abstract freely is crucial.  It does not lead to inconsistencies  
> since the typing of constructors ensures that elements of X are  
> never stored in Lists.
>
> Surely, Vec
>
>  data Vec (A : Set) : Nat -> Set where
>    vnil  : Vec A zero
>    vcons : A -> Vec A n -> Vec A (suc n)
>
> should be injective in both arguments, but I would not deduce this  
> from size considerations.  In this case it holds even if Vec would  
> be just a definition
>
>  Vec A zero    = 1
>  Vec A (suc n) = A * Vec n
>
> because the cartesian product is injective.

How do you prove that cartesian product is injective? Or List?

Cheers,
Thorsten

>  Inferring injectivity from the definition is a very conservative  
> approach, and you may have a more liberal proposal in mind which I  
> would be interested to learn more about.  Yet, I do not think it can  
> be realized with the predicativity restriction, since Set and Set ->  
> Set are both part of the same universe Set1, hence, need to be  
> distinguished otherwise in order to separate the good (Vec) from the  
> bad (I, J).  Probably that size check would be more like the  
> positivity test for data types.
>
> Cheers,
> Andreas
>
> P.S.:  I would have expected that
>
>  data I : (Set -> Set) -> Set where
>
> is not even a well-formed inductive family in Agda, since the index  
> (Set -> Set) is too large.  But since there are no constructors, it  
> goes through...
>
>
> Chung Kil Hur a écrit :
>> ----- Original Message ----- From: "Andrew Pitts" <Andrew.Pitts at cl.cam.ac.uk 
>> >
>> To: "Agda mailing list" <agda at lists.chalmers.se>
>> Cc: "Andrew M Pitts" <andrew.pitts at cl.cam.ac.uk>
>> Sent: Sunday, January 10, 2010 3:34 PM
>> Subject: Re: [Agda] Agda with the excluded middle is inconsistent ?
>>> I have been following this thread with interest. What is needed most
>>> is a simple yet expressive (and fixed!) core type theory with an
>>> easily understandable (by users) semantics: we should not have to
>>> "discover" the _logical_ consequences of  an implementation---it's a
>>> bit like saying the meaning of my programming language is given by  
>>> my
>>> compiler.
>>>
>>> The rest of this message is speculation without reference to such a
>>> semantics. :-)
>>>
>>> Personally, my bet is that the version of Agda2 that allows one to
>>> prove that type constructors are injective up to intensional  
>>> equality
>>> is inconsistent, without  the need for any form of excluded middle
>>> postulate.
>>>
>>> I say this not because I think that the injectivity up to  
>>> intensional
>>> equality of type constructors is in itself contradictory---indeed I
>>> believe it is quite a natural property to ask for....so long as the
>>> universe in which the type constructor is valued is sufficiently
>>> large. For example, in the presence of injectivity, allowing Set to
>>> contain a (Set -> Set)-indexed family of mutually distinct names for
>>> the empty set
>>>
>>> data I : (Set -> Set) -> Set where
>>>
>>> seems dangerous because Set is "too small"; whereas allowing it in  
>>> Set1
>>>
>>> data I1 : (Set -> Set) -> Set1 where
>>>
>>> seems uncontentious. So I would advocate applying the same
>>> predicativity/size considerations to (injective) type constructors  
>>> as
>>> Agda currently applies to data constructors. Another example: Agda2
>>> allows
>>>
>>> data J (f : Set -> Set) : Set where
>>>   unit : J f
>>>
>>> almost by accident, since it doesn't allow
>>>
>>> data K : (f : Set -> Set) -> Set where
>>>   unit :  (f : Set -> Set) -> K f
>>>
>>> because of predicativity restrictions on data constructors. I would
>>> prefer to rule out both declarations while still allowing injective
>>> type constructors like
>>>
>>> data J1 (f : Set -> Set) : Set1 where
>>>   unit : J1 f
>>>
>>> or
>>>
>>> data K1 : (f : Set -> Set) -> Set1 where
>>>   unit :  (f : Set -> Set) -> K1 f
>>>
>>> Best wishes,
>>>
>>> Andy
>> Hi, I agree with Andy and I think the injectivity of type  
>> constructors is useful.
>> As long as Andy's idea, or a similar idea, is proven to be  
>> consistent, that can be used in reasoning about heterogeneous  
>> equality.
>> There are two well-known notions of heterogeneous equalitay: JMeq  
>> and eq_dep.
>> The definitions are as follows:
>> Inductive JMeq (A:Set) (a:A) : forall (B : Set), B -> Prop :=
>>   | refljm : JMeq A a A a .
>> Inductive eq_dep (U:Set) (Sig: U -> Set) (x: U) (a: Sig x) : forall  
>> (y : U), Sig y -> Prop :=
>>  | refldep : eq_dep U Sig x a x a .
>> Now, assume that you have the following heterogeneous eqaulities.
>>   (1) JMeq (Vector n) l (Vector m) l'    (2) eq_dep nat Vector n l  
>> m l' From (1), you can get the equation
>>     Vector n = Vector m
>> but, not n = m as you don't have the injectivity of Vector.
>> On the contrary, from (2), you can get the equation
>>     n = m
>> So, without the injectivity of Vector, the equation (1) does not  
>> have the same information as the equation (2).
>> But, the notion of JMeq is more homogeneous, general and convinient  
>> than that of eq_dep.
>> So, if you can enusre that some of your type constructors are  
>> injective, you can freely use JMeq instead of eq_dep for the data  
>> types.
>> Indeed, I have developed a library, called Heq, to support  
>> reasoning about heterogeneous (or, extensional) equality in  
>> Coq ,and going to be officially released in a few days.
>> This library basically supports both the notions of JMeq and  
>> eq_dep, but in a different uniform way.
>> For JMeq, if you add the injectivity of your type constructors to  
>> the database, the proof search engine uses the information.
>> Without the injectivity, the proof search engine does not do  
>> anything useful for JMeq.
>> The reason why I support for JMeq (though the extra code I added  
>> for supporting JMeq is several lines) is that I believed the  
>> injectivity until I find the inconsistency.
>> Anway, if we can somehow add the injectivity of some inductive type  
>> constructors, it is a quite useful thing for reasoning about  
>> heterogeneous equality.
>> Best wishes,
>> Chung-Kil Hur
>> Preuves, Programmes et Systèmes
>> ------------------------------------------------------------------------
>> _______________________________________________
>> Agda mailing list
>> Agda at lists.chalmers.se
>> https://lists.chalmers.se/mailman/listinfo/agda
>
>
> -- 
> Andreas Abel  <><      Du bist der geliebte Mensch.
>
> Theoretical Computer Science, University of Munich
> http://www.tcs.informatik.uni-muenchen.de/~abel/
> _______________________________________________
> Agda mailing list
> Agda at lists.chalmers.se
> https://lists.chalmers.se/mailman/listinfo/agda



More information about the Agda mailing list