Zulip Chat Archive
Stream: new members
Topic: defining wff
Patrick Thomas (Aug 03 2019 at 00:11):
I was wondering if the following definition can be formalized in Lean, and if so, how. I am thinking that a propositional variable might be defined as a natural number, but I am not sure how to introduce the connectives.
DEFINITION. The set of wffs is the intersection of all sets S of formulas such
that:
(i) p ∈ S for each propositional variable p.
(ii) For each formula A, if A ∈ S, then ~A ∈ S.
(iii) For all formulas A and B, if A ∈ S and B ∈ S, then [A ∨ B] ∈ S.
A wff is a member of the set of wffs.
I would like to use this definition in a formal proof of the following exercise:
Using the definition of the set of wffs, show that:
(a) Every formula consisting of a propositional variable standing alone is
a wff.
(b) If A is a wff, then ~A is a wff.
(c) If A and B are wffs, then [A ∨ B] is a wff.
Mario Carneiro (Aug 03 2019 at 00:27):
While it is possible to define wffs in this set-theoretic way, the much easier approach is to use an inductive type - this is what they are designed for. With that the theorem is trivial, as it is just the constructors of the inductive type
Floris van Doorn (Aug 03 2019 at 00:31):
Here is an example of using inductive types for this:
-- α is the type of propositional variables inductive wff (α : Type) : Type | var : α → wff | neg : wff → wff | or : wff → wff → wff local prefix `#` := wff.var local prefix `~` := wff.neg local infix ` ∨ ` := wff.or example {α} (p q : α) : wff α := #p ∨ ~ #q
Patrick Thomas (Aug 03 2019 at 00:40):
Thank you. I would still be interested in seeing how it might be done in the set-theoretic way, if you have a chance.
Floris van Doorn (Aug 03 2019 at 00:49):
In that case, I would define a character as a propositional variable or one of the 4 special characters (~ [ ] ∨
) and then define S
to be a set on the type of list of characters (S
is the intersection of all sets satisfying ...)
Patrick Thomas (Aug 03 2019 at 00:58):
I'm sorry, I'm not sure I understand.
Andrew Ashworth (Aug 03 2019 at 01:16):
It's a much more raw interpretation. Your formulas are sequences of [ ] ~ \/ 1 2 3 4 5 6 7 8 9
. Step 1 is to turn a sequence of digits into a var. Step 2 is to come up with a prop describing 1, 2, 3 in terms of this raw list of characters.
Floris van Doorn (Aug 03 2019 at 01:17):
import data.set.lattice noncomputable theory open sum -- Var is the type of propositional variables constant Var : Type def character := Var ⊕ fin 4 def lbracket : character := inr 0 def rbracket : character := inr 1 def neg : character := inr 2 def disj : character := inr 3 local notation `⟦` := lbracket local notation `⟧` := rbracket local notation `~` := neg local notation `∨` := disj def wff : set (list character) := ⋂₀ { S | (∀(p : Var), [inl p] ∈ S) ∧ (∀(A ∈ S), [ ~ ] ++ A ∈ S) ∧ ∀(A B ∈ S), [ ⟦ ] ++ A ++ [ ∨ ] ++ B ++ [ ⟧ ] ∈ S }
Patrick Thomas (Aug 03 2019 at 01:24):
It might take me a bit to go through this, but thank you!
Last updated: Dec 20 2023 at 11:08 UTC