Propositional logic deals with the connectives
¬ (negation),
∧ (conjunction),
∨ (disjunction),
⇒ (implication),
and ⇔ (equivalence).
The language of propositional logic contains the following symbols:
¬, ∧, ∨, ⇒, ⇔, and(, ).The set of propositional logic formulas, F, is the smallest one satisfying
X such that X is a variable then X ∈ F,φ and ψ, if φ and ψ ∈ F, then
¬φ ∈ F,
φ∧ψ ∈ F,
φ∨ψ ∈ F,
φ⇒ψ ∈ F,
and φ⇔ψ ∈ F,φ such that φ ∈ F then (φ) ∈ F.
We can also use the constants t, or ⊤, for true, and
f, or ⊥, for false and have these as propositional formulas but
not all authors use them.
The meaning of a connective is given by its truth table.
These truth tables in combination with a
truth assignment allow us to assign a truth value (t or f)
to a formula.
A truth assignment, γ satisfies a formula φ,
written γ⊨φ, if φ evaluates to t
using γ.
A formula φ is satisfiable if there is some truth assignment γ
such that γ⊨φ.
A truth assignment, γ satisfies a set of formulas Γ,
written γ⊨Γ,
if γ satisfies every member of Γ.
A formula φ is logically valid, written ⊨φ, if φ
is satisfied by every truth assignment.
A formula φ is a logical consequence of the set of formulas Γ,
written Γ⊨φ,
if φ is satisfied by every truth assignment that satisfies Γ.
The formulas φ and ψ are equivalent,
written φ≡ψ if they are satisfied by the same
assignments.
The following is a Prolog implementation of the semantics of propositional logic. The code is specific to Barry's Prolog but should work on other Prolog implementations which provide association lists.
:- ensure_loaded(runtime(assoc)). % A library that supplies get_assoc/3
%%%
%%% The syntax of propositional logic
%%%
%%% I use the built in parser and change/augment the Prolog operators to handle
%%% propositional logic.
%%%
:-op(200, fy, ~). % Negation
:-op(0, yfx, (/\)).
:-op(400, xfy, (/\)). % Conjunction (not ISO associativity which is yfx)
:-op(0, yfx, (\/)).
:-op(500, xfy, (\/)). % Disjunction (not ISO associativity which is yfx)
:-op(600, xfy, ==>). % Implication
:-op(700, xfy, <=>). % Equivalence
%%%
%%% pl_eval_not(P, NotP).
%%%
%%% The samantics of the propositional logic negation connective.
%%%
pl_eval_not(true, false).
pl_eval_not(false, true).
%%%
%%% pl_eval_and(C1, C2, Conjunction)
%%%
%%% The semantics of the propositional logic conjunction.
%%%
pl_eval_and(true, true, X) :- !, X = true.
pl_eval_and(_, _, false).
%%%
%%% pl_eval_or(C1, C2, Disjunction)
%%%
%%% The semantics of the propositional logic disjunction.
%%%
pl_eval_or(false, false, X) :- !, X = false.
pl_eval_or(_, _, true).
%%%
%%% pl_eval(F, V, Answer)
%%%
%%% Using the valuation (truth assignment) V we evaluate the formula F to Answer (true, false).
%%% This is the mathematical definition of the semantics of propositional logic.
%%% An association list is used to implement the truth assignment.
%%%
%%% assoc_to_list(V, [p-true, q-false, r-true]), pl_eval((p /\ q ==> q \/ r), V, Answer).
%%% assoc_to_list(V, [p-true, q-true, r-false]), pl_eval((p /\ q ==> q /\ r), V, Answer).
%%%
pl_eval(false, _, false).
pl_eval(true, _, true).
pl_eval(Atom, V, Answer) :-
atom(Atom),
!,
get_assoc(Atom, V, Answer).
pl_eval(~Phi, V, Answer) :-
pl_eval(Phi, V, Temp),
pl_eval_not(Temp, Answer).
pl_eval(Phi /\ Psi, V, Answer) :-
pl_eval(Phi, V, T1),
pl_eval(Psi, V, T2),
pl_eval_and(T1, T2, Answer).
pl_eval(Phi \/ Psi, V, Answer) :-
pl_eval(Phi, V, T1),
pl_eval(Psi, V, T2),
pl_eval_or(T1, T2, Answer).
pl_eval(Phi ==> Psi, V, Answer) :-
pl_eval(~Phi \/ Psi, V, Answer).
pl_eval(Phi <=> Psi, V, true) :-
pl_eval(Phi, V, T1),
pl_eval(Psi, V, T2),
T1 == T2,
!.
pl_eval(_ <=> _, _, false).
Doets, Kees. From Logic to Logic Programming. MIT Press, 1994.
Harrison, John. Handbook of Practical Logic and Automated Reasoning. Cambridge, 2009.
Copyright © 2014, 2015 Barry Watson. All rights reserved.