Syntax of propositional logic
From Learning Logic for Computer Science
An arithmetic expression like \(x + 3 * y\) describes precisely one way to combine arithmetic constants (\(3\) in the example) and arithmetic parameters (\(x\) and \(y\) in the example) using arithmetic operations (\(+\) and \(*\) in the example); a propositional formula does the same with boolean constants (true and false), boolean parameters (variables for true and false), and boolean functions such as and and or.
Contents
Introduction
Example \(\bot \vee (X_0 \wedge X_1)\) is a propositional formula, where \(\bot\) stands for false, \(\vee\) stands for or, and \(\wedge\) stands for and.
Example \((X_0 \wedge \neg X_1) \vee (\neg X_0 \wedge X_1)\) is another propositional formula, \(\neg\) stands for not.
Clearly, in both examples a formula is a sequence of symbols (a character string). From a technical point of view, it is, however, more reasonable to imagine and define a formula as a tree, where
- a tree has a root and a finite positive number of nodes,
- each node has a label, and
- the children of a node are linearly ordered.
In this example the left child of the root has two children: one is labelled \(X_0\), the other one \(\neg\). In the order the one labelled \(X_0\) comes first and the one labelled \(\neg\) comes second.
For simplicity, when a tree is drawn there is no particular way of indicating nodes other than showing its label, because every node is labelled (and the empty label is not allowed).
Formal definition
A propositional variable is of the form \(X_i\) where \(i\) stands for a natural number. The set of all propositional variables is denoted \(\text{PVars}\). There are two symbols for boolean constants, \(\bot\) and \(\top\), which stand for false and true, respectively, and are read false and true, respectively.
The definition of the set of all propositional formulas is an inductive definition.
Base elements:
- The one-node trees where the only node is labelled with one of the two constant symbols, \(\bot\) and \(\top\), are propositional formulas.
- The one-node trees where the only node is labelled with one of the propositional variables are propositional formulas.
These formulas are called atomic formulas.
Inductive rule:
- If \(C\) is a connective of arity \(n\) and \(\varphi_0, \dots, \varphi_{n-1}\) are propositional formulas, then the tree with root labelled \(C\) and the \(n\) subtrees \(\varphi_0\), ..., \(\varphi_{n-1}\) is a propositional formula.
These formulas are called composite formulas.
The set of all propositional formulas is denoted by \(F_\text{PL}\).
Example
The tree is a propositional formula; note that \(\bigvee\) has not only arity two, but also arity three according to our list of connectives.
Example
The tree is not a propositional formula, because \(\neg\) has arity \(1\), but not arity \(3\), and because \(a\) is neither a symbol for a boolean constant, nor a propositional variable, nor a connective.
Commonly used notation
To simplify notation, formulas are often written as sequences of symbols (strings) using parentheses rather than drawn as trees. There is a general notation, which is used in definitions and proofs, and a more human-readable one.
Prefix notation
The general notation is the commonly used prefix notation, where the connective is prefixed to the sequence of the strings for the subtrees and the elements of the sequence of children are separated by commas. Beginning and end of this sequence are marked by an opening and a closing parenthesis.
Example The formula from the first example above is written as \(\bigvee(X_1, X_0, \neg (X_2))\).
Example The inductive definition of a formula can also be written as follows.
Base elements:
- The symbols \(\bot\) and \(\top\) are propositional formulas.
- Every propositional variable is a propositional formula.
Inductive rule:
- If \(C\) is a connective of arity \(n\) and \(\varphi_0, \dots, \varphi_{n-1}\) are propositional formulas, then \(C(\varphi_0, \dots, \varphi_{n-1})\) is a propositional formula.
Human-readable notation
The starting point for human-readable notation is the above prefix notation. The difference is that some parentheses are saved to avoid cluttering and connectives are written infix to get rid of commas.
The rules for human-readable notation are:
- If a connective is used with arity two or more, then it is written in infix notation with parentheses around the string. At the same time, capital connectives become small connectives (which is consistent with the semantics). Example: \(\neg(X_0 \vee X_1 \vee X_2)\) instead of \(\neg(\bigvee(X_0, X_1, X_2))\).
- These parentheses can be omitted for the connective at the root (in the corresponding tree) and if the connective of the corresponding parent node has lower precedence. For the precedence of the connectives, see list of connectives. Example: \(X_0 \vee X_1 \vee X_2\) instead of \(\bigvee(X_0, X_1, X_2)\). Example: \(X_0 \rightarrow X_1 \vee \neg X_2\) instead of \(X_0 \rightarrow (X_1 \vee \neg X_2)\).
- Parentheses for a connective with arity \(1\) can be omitted when the child is a constant symbol or a variable or a connective with arity \(1\). Example: \(\neg X_0\) instead of \(\neg(X_0)\).
- The infix notation is only allowed for the connectives \(\bigwedge\), \(\bigvee\), and \(\bigoplus\). Example: \(X_0 \oplus X_1\oplus X_2\) is allowed in the humand-readable notation while \(X_0 \dot\vee X_1 \dot{\vee} X_2\) is forbidden.
Meta notation
In certain situations, it is useful to work with a symbol like \(\bigwedge\) just as with \(\sum\). This means that \[\bigwedge_{i < n} X_i\] stands for \[\bigwedge(X_0, \dots, X_{n-1}) \enspace,\] which can be written as \[X_0 \wedge \dots \wedge X_{n-1}\enspace.\]