Skip to Content.
Sympa Menu

coq-club - [Coq-Club] Module types as types

coq-club AT inria.fr

Subject: The Coq mailing list

List archive

[Coq-Club] Module types as types


Chronological Thread 
  • From: Constantine Plotnikov <constantine.plotnikov AT gmail.com>
  • To: coq-club AT inria.fr
  • Subject: [Coq-Club] Module types as types
  • Date: Sun, 13 Mar 2022 07:10:59 +0300
  • Authentication-results: mail3-smtp-sop.national.inria.fr; spf=None smtp.pra=constantine.plotnikov AT gmail.com; spf=Pass smtp.mailfrom=constantine.plotnikov AT gmail.com; spf=None smtp.helo=postmaster AT mail-oo1-f44.google.com
  • Ironport-data: A9a23:uvQkz6rJlFrxM3fsTMXcRIsnABNeBmIgYxIvgKrLsJaIsI4StFCzt garIBmPO6rbMGH9f9pwPNjn8R4AuZfRxoc2SlQ+riEyRSoapePIVI+TRqvSF3PLf5ebFCqLz O1HN4KedJhsJpP4jk3wWlQ0hSAkjclkfpKlVKicfHkZqTZMEE/Nszo68wICqtMu0IDR7z+l4 4uo+ZWEYQX9gVaYD0pNg069gEM31BjNkGhA1rAOTagjUIj2yhH5pLpGTU2AByOQrrt8RoZWd M6fpF2NxV41yj92Yj+TfhkXRWVRKlLaFVDmZnO7wMFOiDAazsA5+v5T2Pbx9S67hh3R9+2dx umhurSsYz4pIo6Pvd9HcEF1TAMiDI9M++fudC3XXcy7lyUqclPpyvRqSUYxZMgWproxDmZJ+ vgVbjsKa3hvhcrsmOP9GrQq35p6apW3VG8ckikIITXxBvEgWozKRbnL49IexDM3msZPHvHAT 8UcYDtrKh/HZnWjP39HU81vwbjz7pX5W3pCtVaHrqAO323C8C1fzrzVb5nLIfXfEK25mW7B/ j6cl4jjOTkRM8Xawj6Y+Fq3l+rXlGX6XpgTHfu27JZXbEa7w2USDFgRUgL+r6XlzEG5XN1bJ gof/S9GQbUOGFKDUvPEXwGb41u/5D1EdoVyT9wY4gLV4/+Bi+qGPVQsQjlEYd0gkcY5Qz02y 1OE9+8F4xQ/79V5rlrNpt+pQSOO1Ts9djBdOHdVJecRy5yy/9Fp10OnosNLSfbt1rXI9SfML ydmRRXSap0WhM8PkqK8pBXJ327qqZ/OQQo4oA7QWwpJDz+Vhqb1PuRECnCBt56sybp1qHHf5 BDofODAtIgz4WmlznDlfQn0NOjBCwy5GDPdm0VzOJIq6i6g/XWuFagJvm0hfR4yaJtfKWK3C KM2he+3zM8MVJdNRf8nC79d9+x3pUQdPYi9BqGNNoQmjmZZLVbboH0GibGsM5DFyRBwy8nTy L+UdsGjCXtyNEiU5Gveegvp6pdynnpW7TqLG/jTlk37uZLDOiP9YepaaDOmM7FhhIvZ8V692 4sOZ6OilU8COMWgOXK/2dBIfTg3wY0TX8+eRzp/Lb7dfGKL2QgJV5fs/F/WU9c8zvoPybuQo C3Vt40x4AOXuEAr4D6iMhhLAI4Dl74mxZ7iFSBzb1uuxVY5ZoOjsPUWe5ctLOso8eViybh/S PxcI5eMBfFGSzLm/TUBbMml/NYyKkjz3Q/ebTC4ZDUffoJ7Q1Ob99LheDzp/nZcAyeys/w4v LD9hBjQRoAORlg5AcuPMKCvwlq9sGIzguV3W0eUcNBfdF+9oodvIi31yPQwJphUexnEwzKb0 SeQAAsZ9bGd+d9rrIGRiPnd/YmzEuZ4Ek5LJEXh7O67ZXvA426u4Y5cS+LXLz3QUWXD/q/9N +hYyvfLNuJewARHvo96JLZczawk4uzpqbIHnB9vG2/GbgjyB75tfiuG0M1IuvEfz7NVo1HtC EeG+90fPrLQfc25TBgeIw0qaunF3vYRw2GA4fMwKUT8xSl24LvXDhkIbkfU0HRQfOlvLYco4 eY9o8pKuQaxvRwnb4SdhSdO+mXQc3END/c9upcBDNO5gwYn0AsZM5nVCyuz55bWLtsQbg8lJ TibgKeEjLNZnxKQf302HHnL/OxcmZVe50wQnQFafwyEyojfm/s6/BxN6jBrHA5b+RNKjrBoM W9xOkwpeKiD8l+EXiSYs7xAxu2AOPGYxqA1414AlWmcSE7xE2KRcCsyPuGC+E1f+GVZFtSeE Hd01069OQsGvumotsfxZaKhg/PmRN11sAbFnahL2uybSoIib2ONbrCGPAI1RtiOPS/1rELCr Ohuuu13bMUX8MLWT7ITU+Gn6FjbdPxIyKGujx2sEGPl0FwwoA2P5AU=
  • Ironport-hdrordr: A9a23:8/Id26EohcEtvmO2pLqE5ceALOsnbusQ8zAXPiFKOHtom6mj/f xG885rtiMc5AxwZJhCo7G90cu7MBHhHPdOiOF7AV7IZniChILHFvAH0WIg+VHd8u/Fm9K1GZ 0OT0G2MrPNMWQ=
  • Ironport-phdr: A9a23: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 xpwgQx7M71FyQ==
  • Ironport-sdr: DvJr5AaqpW/su8hBvCbK0Dpqq7lsolMcu2BWj+uuyD2O5WabhMfE9KoIV0souJC/7htFr89U0o xIEguEkn/r2IlJQqRCC8/SA4NedUW3j8DBzsyeSsVnaxXuqUOInh5J1YzIzRzUjxhGmQPU8vgY EbU22OVnsmxDORFC5FjNDEQc8gmnnhDHc9bcWMUMm8S51ybHTx3Pd57sr28ia5asSKsG4pkYzJ 9/p2GE9cf2W0rExG5taQD5UVr0NFSEuPbEx2tmb3dPNlfZCkDHdmBa/x4Vd9d/fRngjJf9nbb6 WTrmGH6kHirwUIAfciFdZAqg

Hi!

I’m doing some exploration about applying Curry–Howard correspondence from Object-Oriented Programming to logic. And I’ve discovered that I could get in Coq quite close to it, but I hit some problems on the way. And I do not quite understand if Coq is missing a needed feature or if I miss some Coq feature to complete the experiment. I’ve read documentation on the modules, but it is a bit lacking in examples. And I've not found examples that were close enough to what I want to do.

Let’s start with what I’m trying to do.

-------------------------------------------

Module TestOOP.

  Module Type SemiGroup.
    Parameter T : Type.
    Parameter operation : T -> T -> T.
    Axiom associative_prop : forall a b c : T, operation (operation a b) c = operation a (operation b c).
  End SemiGroup.

  Module Type Monoid.
    Include SemiGroup.
    Parameter identity : T.
    Axiom identity_prop_right : forall a : T, operation a identity = a.
    Axiom identity_prop_left : forall a : T, operation identity a = a.
  End Monoid.

  Module Type Group.
    Include Monoid.
    Parameter inverse : T -> T.
    Axiom inverse_prop_right : forall a: T, operation a (inverse a) = identity.
    Axiom inverse_prop_left : forall a: T, operation (inverse a) a = identity.
  End Group.

  Module Type AbelianGroup.
    Include Group.
    Axiom comutative : forall a b : T, operation a b = operation b a.
  End AbelianGroup.

  Module Type Ring.
    Parameter T : Type.
    Parameter zero : T.
    Parameter one : T.
    Parameter plus : T -> T -> T.
    Parameter unary_minus : T -> T.
    Parameter mult : T -> T -> T.
    Axiom distributive_left : forall a b c : T, mult (plus a b) c = plus (mult a c) (mult b c).
    Axiom distributive_right : forall a b c : T, mult (plus a b) c = plus (mult a c) (mult b c).
    (* does not work after it *)
    Axiom plus_group: AbelianGroup with T := T, operation := plus, identity = zero, inverse = unary_minus.
    Axiom mult_monoid: Monoid with T := T, operation := mult, identity = one.
  End Ring.

  Module ZRing <: Ring.
    Definition T := Z.
    Definition zero = 0%Z.
    ...
    Theorem plus_group : AbelianGroup with T := T, operation := plus, identity = zero, inverse = unary_minus).
      (* proof that it exists with specified operators *)
    End plus_group.
  End ZRing.
 

End TestOOP.


-------------------------------------------------------------------------

This is a classical definition that integer is a ring and was supposed to be used as a sample of correspondence between OOP and logic. But I’ve not found a clear way to use module types as types. The currently used way is some syntax that reflects my intention. The definition “p : AbelianGroup(…)” in context means that all elements of it are available with context as proposition prefixed by “p” like “p.inverse” as function or “p.associative_prop” as proposition, just like for module access. To introduce this proposition to context one needs to define a completely specified module (with all parameters passed to module construction or defined as definitions or theorems within the module). The parameter “p” is like a tuple argument here. All its elements could be passed separately, so there are no excess logical problems.

So, I’m trying to figure out how to proceed. There seems to be a way to use inductive types for this, and I plan to investigate if this is possible later.  However, modules look like the right thing to use here, so I would like to see if I’ve missed something. The inference rules at document at https://coq.inria.fr/doc/language/core/modules.html?highlight=modules suggest that modules could be actually used as types, but I’ve not found a way to do it.

I came to this when I was trying to apply CFC from the concepts of interfaces and classes to Coq. An interface corresponds to syntactically correct theory. A class corresponds to a satisfied theory. Both interfaces and types could be used in OOP. Module also corresponds to the concept of theory from Mathematical Logic, so it looks like it might be also usable as type.

Best Regards, Constantine 




Archive powered by MHonArc 2.6.19+.

Top of Page