I was going through IndProp in software foundations and Adam Chlipala's chapter 4 book and I was having difficulties understanding inductive propositions.
For the sake of a running example, lets use:
Inductive ev : nat -> Prop :=
| ev_0 : ev 0
| ev_SS : forall n : nat, ev n -> ev (S (S n)).
I think I do understand "normal" types using Set
like:
Inductive nat : Set :=
| O : nat
| S : nat -> nat.
and things like O
just return the single object of type nat
and S O
is taking an object of type nat
and returning another different one of the same type nat
. By different object I guess I mean they have different values.
What I am confused is on how exactly the constructors for inductive props differ from inductive types Set
. For Set
it seems they just behave as function, a function that take values and return more values of that type. But for Inductive Propositions I am having a hard time figuring out what they do.
For example take ev_0
as a simple example. I assume that is the name for the propositional object (value) ev 0
. Since it's by itself ev 0
must be a Prop
a proposition. But what exactly makes it true? If its a proposition it could be false I assume. I guess the induction is confusing me. ev
is the "function that returns objects of some type (proposition)", so ev 0 is just a proposition, but we have not said what ev 0
should mean (unlike in my definition of natural number the base case is clear what its doing). In python I would expect to see
n == 0: return True
or something for the base case. But in this case it seems circular pointing to itself and not to something like True
. I know there is a foundational misconception I have but I don't know what exactly what I am not understanding.
Also whats confusing me is the naming. In the nat
the name O
was crucial for building/constructing objects. But in the inductive definition ev_0
seems to be more like a label/pointer to the real value ev 0
. So I'd assume ev_SS == ev_0 -? ev 2
doesn't really make sense but I don't know why. How are the labels here acting differently from the labels in the inductive types using set
?
For ev_SS
thats even more confusing. Since I don't know what labels are doing of course thats confusing me but look how this is pointing:
forall n : nat, ev n -> ev (S (S n))
so given a natural number n
I assume it returns the proposition ev n -> ev (S (S n))
(I am assuming forall n : nat
is not part of the proposition object and its just there to indicate when the constructer that returns propositions works). So forall n : nat, ev n -> ev (S (S n))
isn't really a proposition but ev n -> ev (S (S n))
.
Can someone help me clarify how inductive proposition type really work in Coq?
Note I don't truly understand the difference between Set
vs Type
but I believe that would be a whole other post by itself.
Some more comments:
I was playing around with this some more and did:
Check ev_SS
and to my surprise got:
ev_SS
: forall n : nat, ev n -> ev (S (S n))
I think this is unexpected because I didn't expect that the type of ev_SS
(unless I am misunderstanding what Check
is suppose to do) would be the definition of the function itself. I thought that ev_SS
was a constructor so in my mind I thought that would do a mapping in this case nat -> Prop
so of course thats the type I expected.
ev_SS 0 ev_0
andev_SS 2 (ev_SS 0 ev_0)
and the fact it reads like nonsense to my brain (though I am sure they mean something) I realized that explaining how arguments work might be really useful to me, I already made a question about it a few hours ago: stackoverflow.com/questions/53807507/… – Charlie Parker