Commit 3cb126ca authored by Robbert Krebbers's avatar Robbert Krebbers

More documentation for the type class logical operators.

parent 878aa716
...@@ -25,9 +25,22 @@ Arguments unseal {_ _} _. ...@@ -25,9 +25,22 @@ Arguments unseal {_ _} _.
Arguments seal_eq {_ _} _. Arguments seal_eq {_ _} _.
Unset Primitive Projections. Unset Primitive Projections.
(* The [Or] class is useful for efficiency: instead of having two instances (* Below we define type class versions of the common logical operators. It is
[P → Q1 → R] and [P → Q2 → R] we could have one instance [P → Or Q1 Q2 → R], important to note that we duplicate the definitions, and do not declare the
which avoids the need to derive [P] twice. *) existing logical operators as type classes. That is, we do not say:
Existing Class or.
Existing Class and.
If we could define the existing logical operators as classes, there is no way
of disambiguating whether a premise of a lemma should be solved by type class
resolution or not.
These classes are useful for two purposes: writing complicated type class
premises in a more concise way, and for efficiency. For example, using the [Or]
class, instead of defining two instances [P → Q1 → R] and [P → Q2 → R] we could
have one instance [P → Or Q1 Q2 → R]. When we declare the instance that way, we
avoid the need to derive [P] twice. *)
Inductive TCOr (P1 P2 : Prop) : Prop := Inductive TCOr (P1 P2 : Prop) : Prop :=
| TCOr_l : P1 TCOr P1 P2 | TCOr_l : P1 TCOr P1 P2
| TCOr_r : P2 TCOr P1 P2. | TCOr_r : P2 TCOr P1 P2.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment