Created
August 24, 2015 13:44
-
-
Save cocreature/f9c6cedaf9022cd0544d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Operator ~ : (0). | |
[~(P)] =def= [not(P)]. | |
Theorem dne_lem : | |
[fun(U{i}; P. | |
~(~(plus(P;~(P)))) | |
)] { | |
unfold <~>; unfold <not>; unfold <implies>; intro; [id, auto]; intro; [id, auto]; | |
assert [not(P)]; | |
unfold <not>; | |
unfold <implies>; | |
[intro,id]; | |
aux {auto}; | |
[witness [ap(x;inl(x'))], witness [ap(x;inr(H))]]; | |
auto | |
}. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Nicely done! A few quick suggestions:
First, you may prefer to use the notation mechanism to define
~
rather than defining a new operator which has to be unfolded:Next, you can prove an even stronger theorem in JonPRL by quantifying
P
using the family intersection type rather than the dependent function type:isect(U{i}; P. ...)
. The difference between the two isthat the intersection type requires the evidence to be uniform with respect to all suchP:U{i}
, whereas evidence for the dependent function contains the variableP
and may depend on it in some way.Finally, we have some nice notation for intersections, functions and sums which would allow you to write
(or something like that) instead of