Documentation

SE.Logic.Language.Negation

AUX-002. Negation (in the object language) #

This module defines one operation, neg, that sends each object-language proposition p to another object-language proposition neg p, its negation, written ¬p in prose. It is a function on propositions. It carries no rules about how negation behaves.

neg is not Lean's ¬ (Not). Lean's ¬ operates in the metalanguage, the logic we reason in. neg operates in the object language, the logic we reason about, whose propositions a substrate and its frameworks commit to (see also Bottom or ⊥ vs Lean's False).

Concretely: neg p is a term of type P.Proposition, a proposition that can be put in a theory; ¬P is a Lean Prop, a claim in our own reasoning. They meet only through the consequence relation, for instance, entailing both p and neg p is what yields ⊥.

A programmer's intuition for negation comes from classical logic, where all three of these hold. Modeling records under disagreement, we do not want them in the shared language.

Assuming any of these would let one interpretive framework force conclusions on the shared base that another framework rejects. Withholding them keeps the object language weak enough to stay neutral. The language commits to having a negation, and commits to nothing about how it resolves.

PropositionCarrier supplies the bare type of object-language propositions. This module adds the negation operation on that type; Bottom adds the distinguished contradiction ⊥; AUX-005 adds the consequence relation that ties neg and ⊥ together. No module in this layer adds negation's laws and those never enter the theory.

A choice of negation operation on a proposition carrier: for each object-language proposition p, a proposition neg p read ¬p.

This is data, not a law: it says how to form ¬p and asserts nothing about its behaviour. It is deliberately not Lean's ¬ (Not), and no involution (¬¬p = p), excluded middle (p ∨ ¬p), or decidability is assumed.

Instances For