[Agda] Re: How can I prove associativity of vectors?

Frédéric Blanqui frederic.blanqui at inria.fr
Wed Dec 17 16:43:02 CET 2014


Termination and confluence.

Le 17/12/2014 16:34, Andrea Vezzosi a écrit :
> Hi,
>
> What kind of restrictions do these systems impose on the rewrite rules
> to keep equality checking decidable?
>
> Best,
> Andrea
>
> On Wed, Dec 17, 2014 at 4:21 PM, Frédéric Blanqui
> <frederic.blanqui at inria.fr> wrote:
>> Hello.
>>
>> Another alternative is to extend the congruence on types while keeping it
>> decidable. For instance, it is possible to extend it with the equation
>> (x+y)+z = x+(y+z) on ℕ, which is an inductive consequence of the definition
>> of +. This is done for instance in:
>>
>> - http://dedukti.gforge.inria.fr/ is a proof-checker for LF where the
>> congruence on types includes non only beta-reduction but also user-defined
>> rewrite rules, of which (x+y)+z -> x+(y+z) on ℕ is a particular case.
>> Type-level rewriting is very powerful since it allows to encode any
>> functional pure type systems (PTS) in LF + user-defined rewrite rules.
>>
>> - http://pierre-yves.strub.nu/coqmt/ is an extension of Coq where the
>> congruence on types in some context Gamma is extended with all the
>> propositional consequences one can deduce from Gamma modulo some decidable
>> theory like linear arithmetic, of which (x+y)+z = x+(y+z) on ℕ is a
>> particular case.
>>
>> Best regards,
>>
>> Frédéric.
>>
>> Le 17/12/2014 16:00, Jon Sterling a écrit :
>>
>>> Sergei,
>>>
>>> On Wed, Dec 17, 2014, at 01:28 AM, Sergei Meshveliani wrote:
>>>> On Wed, 2014-12-17 at 12:02 +0900, Kenichi Asai wrote:
>>>>> Thank you for the messages!  I could now implement it in two ways.
>>>>>
>>>>>>    * Use Data.Vec.Equality rather than PropositionalEquality.
>>>>> [..]
>>>>>>    * Use Relation.Binary.HeterogeneousEquality rather than
>>>>>>      PropositionalEquality.
>>>>> [..]
>>>>> assoc : ∀ {l m n} → (l1 : Vec ℕ l) → (l2 : Vec ℕ m) → (l3 : Vec ℕ n) →
>>>>>           (l1 ++ l2) ++ l3 ≅ l1 ++ (l2 ++ l3)
>>>>> assoc [] l2 l3 = refl
>>>>> assoc (x ∷ l1) l2 l3 = cong (λ l → x ∷ l) (assoc l1 l2 l3)
>>>>>
>>>>> but it did not work, because cong appears to assume that two sides of
>>>>> ≅ has the same type.  Why is it so?  I think it is more natural that
>>>>> cong etc. in HeterogeneousEquality module are defined for heterogeneous
>>>>> types.
>>>>> [..]
>>>>
>>>> People,
>>>> this whole feature looks like a point of disagreement of Agda to
>>>> mathematics.
>>>>
>>>> In both areas, a domain can depend on a value, and can be treated as a
>>>> value (to a certain extent).
>>>>
>>>> A mathematical computation and discourse can be as follows.
>>>>
>>>>     For all  k : Nat  define an additive semigroup on  (Vec Nat k)
>>>>     with respect to the pointwise addition  _+l_  on vectors.
>>>>
>>>>     Put      Vec1 = Vec Nat (m + n),   Vec2 = Vec Nat (m + n),
>>>>     and let  v  \in Vec1,              v' \in Vec2.
>>>>
>>>>     Let us prove  m + n == n + m.
>>>>     ...
>>>>     All right, proved.
>>>>
>>>>     Hence,  v and v'  belong to the _same_ domain  Vec1,  and to the same
>>>>     additive semigroup H1. Hence it has sense the computation
>>>>
>>>>       _+1_ = Semigroup._*_ H1;
>>>>       u    = v +1 v';
>>>>
>>>>     and so on.
>>>>
>>>> This discourse uses that _identity_ of domains respects the equality
>>>> _==_  on parameter values.
>>>>
>>>> And in a dependently typed language, one has:
>>>>
>>>>     m + n == m + n  proved,  and still  v and v'  are of different
>>>>     types (domains), and cannot be added by the semigroup operation _+1_.
>>>>
>>> With regard to this comment:
>>>
>>>> In mathematics, the domain membership relation  v \in V(p)  can often be
>>>> proved or computed. And in a dependently typed language, the relation
>>>> v : V(p)  has somewhat a different nature, this is not of  (Rel _),  it
>>>> is a language construct.
>>>>
>>>> I do not expect that this difference can be eliminated by some kind of
>>>> refining a language design.
>>> It may be a digression from the point of this thread, but I'll note that
>>> this is not an "essential" property of type theory. Type theories based
>>> on Martin-Löf's 1986 logical framework presentation, such as the theory
>>> underlying Agda, typically do not have a judgement "M in A" which means
>>> "M is a member of domain A" but rather they have a proofhood judgement,
>>> "M is a proof of A". In order for it to be meaningful, this judgement
>>> must be analytic, so it cannot be proved, it can only be "known".
>>>
>>> But other type theories, such as Computational Type Theory (Nuprl) which
>>> expands on Martin-Löf's polymorphic type theory from the early 80s, do
>>> not internally have a judgement like Agda's but instead have a judgement
>>> "A ext M" which means "M is a witness for A" or "M is a realizer for A".
>>> And this judgement behaves more like the domain membership relation
>>> you're talking about, and it can be proved in the logical framework.
>>>
>>> Common practice in the modern intensional LF presentation of type theory
>>> (see Nordström for some examples, also Sambin, though their approaches
>>> differ) is to overlay a "subset theory" on top of the theory.
>>>
>>>> And what a programmer has to do?
>>>>
>>>> May be, one needs in each case to implement a certain appropriate
>>>> natural isomorpsims. In our example, this is  f : Vec2 -> Vec1,
>>>> and to apply   v +1 (f v')  rather than  (v +1 v').
>>>> -- ?
>>>>
>>>> Am I missing something?
>>>>
>>>> Regards,
>>>>
>>>> ------
>>>> Sergei
>>> Kind regards,
>>> Jon
>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> Agda mailing list
>>>> Agda at lists.chalmers.se
>>>> https://lists.chalmers.se/mailman/listinfo/agda
>>> _______________________________________________
>>> Agda mailing list
>>> Agda at lists.chalmers.se
>>> https://lists.chalmers.se/mailman/listinfo/agda
>>
>> _______________________________________________
>> Agda mailing list
>> Agda at lists.chalmers.se
>> https://lists.chalmers.se/mailman/listinfo/agda



More information about the Agda mailing list