[Agda] How can we define a type of symmetric binary operations in
Agda ?
Conor McBride
conor at strictlypositive.org
Tue May 5 11:35:00 CEST 2015
Just popping up briefly...
On 5 May 2015, at 10:27, Andreas Abel <abela at chalmers.se> wrote:
> Looks like you want a higher inductive type...
>
> On 05.05.2015 08:27, Dr. ÉRDI Gergő wrote:
>> What about creating them such that they are symmetric by construction?
Here's an old exercise of mine. Given
data Nat : Set where
ze : Nat
su : Nat -> Nat
symIter : {X : Set} -> (Nat -> X) -> (X -> X) -> Nat -> Nat -> X
symIter zen more ze n = zen n
symIter zen more m ze = zen m
symIter zen more (su m) (su n) = more (symIter zen more m n)
First, show that
symIter zen more
is always commutative.
Then define max, min, addition and multiplication by instantiating zen and
more appropriately.
The key to not seeing more than you should is to change your means of
looking.
All the best
Conor
>> If we had quotient types, one could easily make an "unordered pair"
>> type, and make unary relations over that.
>>
>> Are there any useful tricks to do something similar in Agda?
>>
>> On May 1, 2015 3:07 PM, "Andreas Abel" <abela at chalmers.se
>> <mailto:abela at chalmers.se>> wrote:
>>
>> You can create a record with two fields, one is your binary
>> operation, the other the proof of symmetry.
>>
>> record SymBinOp : Set where
>> field
>> _⊙_ : BinaryOperation
>> proof-of-symmetry : ∀ x y → x ⊙ y == y ⊙ x
>>
>> That's it!
>>
>> On 30.04.2015 17:35, Sergey Kirgizov wrote:
>>
>> Hello,
>>
>> I don't understand how we can define in Agda a type of
>> "Symmetric
>> Binary Relation". Can you help me?
>> Imagine I have something like:
>>
>> =======================================================
>>
>> {-
>> At first we reaname Set
>>
>> {-
>> First, we define a polymorphic idenity
>> -}
>> data _==_ {A : 𝓤} (a : A) : A → 𝓤 where
>> definition-of-idenity : a == a
>> infix 30 _==_
>>
>> {-
>> Next we define the finite set Ω = {A,B,C}
>> -}
>> data Ω : 𝓤 where
>> A B C : Ω
>>
>> {-
>> We add a type "Binary operation"
>> -}
>> BinaryOperation = Ω → Ω → Ω
>>
>> {-
>> I can actually define an example of Binary operation.
>> -}
>> _⊙_ : BinaryOperation
>> x ⊙ x' = A
>> infix 40 _⊙_
>>
>> {-
>> And then I can proove that ⊙ is Symmetric
>> -}
>> proof-of-symmetry : ∀ x y → x ⊙ y == y ⊙ x
>> proof-of-symmetry = λ x y → definition-of-idenity
>>
>>
>> ========================================================
>>
>> How we can define a type "Symmetric Binary Operation"?
>> Having this
>> type we will be able to define ⊙ as
>>
>> _⊙_ : SymmetricBinaryOperation
>> x ⊙ y = A
>>
>> and proof that ⊙ is symmetric will no be required.
>>
>>
>> Best regards,
>> Sergey
>> _______________________________________________
>> Agda mailing list
>> Agda at lists.chalmers.se <mailto:Agda at lists.chalmers.se>
>> https://lists.chalmers.se/mailman/listinfo/agda
>>
>>
>>
>> --
>> Andreas Abel <>< Du bist der geliebte Mensch.
>>
>> Department of Computer Science and Engineering
>> Chalmers and Gothenburg University, Sweden
>>
>> andreas.abel at gu.se <mailto:andreas.abel at gu.se>
>> http://www2.tcs.ifi.lmu.de/~abel/
>> _______________________________________________
>> Agda mailing list
>> Agda at lists.chalmers.se <mailto:Agda at lists.chalmers.se>
>> https://lists.chalmers.se/mailman/listinfo/agda
>>
>
> --
> Andreas Abel <>< Du bist der geliebte Mensch.
>
> Department of Computer Science and Engineering
> Chalmers and Gothenburg University, Sweden
>
> andreas.abel at gu.se
> http://www2.tcs.ifi.lmu.de/~abel/
> _______________________________________________
> Agda mailing list
> Agda at lists.chalmers.se
> https://lists.chalmers.se/mailman/listinfo/agda
More information about the Agda
mailing list