2015-04-30 2 views
2

Je ne comprends pas comment on peut définir dans Agda un type de "Relation Symétrique Binaire". Imaginez que j'ai quelque chose comme:Comment peut-on définir un type d'opérations binaires symétriques dans Agda?

{- 
    First, we define a polymorphic idenity 
-} 
data _==_ {A : Set} (a : A) : A → Set where 
    definition-of-idenity : a == a 
infix 30 _==_ 

{- 
Next we define the finite set Ω = {A,B,C} 
-} 
data Ω : Set 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 

Comment on peut définir un type "Opération Binaire Symétrique"? Avoir ce type, nous serons en mesure de définir ⊙ comme

_⊙_ : SymmetricBinaryOperation 
x ⊙ y = A 

et la preuve que ⊙ est symétrique ne sera exigée.

+3

Vous ne pouvez pas simplement dire que '_⊙_' est symétrique sans pour autant fournir une preuve de ce fait. Par conséquent, il n'y a aucun moyen de définir '_⊙_' comme' _⊙_: SymmetricBinaryOperation; x ⊙ y = A', sauf si vous utilisez des classes de type. La façon habituelle de définir des relations est de regrouper les opérations parmi les preuves dans les enregistrements. Vous pouvez trouver des exemples dans la bibliothèque standard [ici] (http://www.cse.chalmers.se/~nad/repos/lib/src/Relation/Binary.agda). Consultez également le tutoriel [this] (http://people.inf.elte.hu/divip/AgdaTutorial/Sets.Records.html). Et [ce] document (http://cs.ioc.ee/~james/papers/AssistedMonads2.pdf) est instructif. – user3237465

+0

@ user3237465 donc, les enregistrements sont meilleurs que les données? –

+0

Dans la plupart des cas. La différence ressemble beaucoup à 'newtype's et' data's de Haskell. Agda dispose également d'eta-laws pour les enregistrements et effectue une [unification de motif] sophistiquée (http://www2.tcs.ifi.lmu.de/~abel/talkTLCA11.pdf). Rarement vous ne voulez pas avoir eta, comme indiqué [ici] (http://agda.chalmers.narkive.com/l79pECtC/dummie-question-why-records#post4), mais l'exemple sur le lien est maintenant obsolète , et je ne suis pas au courant d'un autre. – user3237465

Répondre

1

Développant mon commentaire: il n'y aurait pas moyen de définir SymmetricBinaryOperation que vous voulez, même s'il y avait une procédure de décision pour le contrôle de symmetryness, car SymmetricBinaryOperation doit porter une preuve Symmetry sur l'opération définie. C'est à dire. l'opération doit se mentionner dans sa propre signature de type, ce qui est clairement une boucle. (D'où mon point sur les classes de type est insensé aussi).

+0

Merci. J'ai aussi trouvé @cody [réponse] (http://cstheory.stackexchange.com/a/16975) à une question de mrsteve. Cody parle de «types de raffinement [qui] capturent la notion de contrats, et sont également liés à la sémantique axiomatique ou à la logique de Hoare». C'est exactement ce dont je parle. –

+1

@Sergey Kirgizov, l'approche des preuves dans une méta-langue mène au côté obscur de la Force. – user3237465