Prolog/Introduction to logic
Since prolog is based heavily on formal logic, it's useful to have some experience with it before starting to learn prolog. This is a short introduction to logic for people who want to learn prolog. It will discuss two logical languages: propositional logic and first-order logic.
Propositional logic has two basic elements, terms and connectives. Terms are represented by letters (usually uppercase), and represent the values true and false, ie. a term can be either true or false, though it doesn't always have to be made clear which they represent. They are in this sense, like variables in mathematics, they represent an unknown value.
Connectives, like the word suggests, connect two terms. The result of this connection takes on the value true or false, based on the values of the two terms. Consider, for instance, the connective AND. It could connect the terms A and B to make the logical sentence "A AND B" (Anything that can take on the values true or false is called a sentence). The sentence "A AND B" is true if both A and B are true. If one or both of them are false, the sentence is false. Connectives are usually represented by symbols rather than words. The following table shows the most commonly used connectives, their meaning and the symbols that are often used to represent them.
|conjunction||A and B||the sentence is true if and only if both terms are true|
|disjunction||A or B||the sentence is true if one or both of the terms are true|
|exclusive or||A xor B||the sentence is true if one of the terms is true, but not both|
|negation||not A||the sentence is true if the term is false and false if the term is true|
|implication||A logically implies B||if A is true the sentence is true only if B is true, if A is false, the sentence is true|
|equality||A is logically equivalent to B||the sentence is true if both terms are true or if both terms are false|
Beware of the meaning of implication, as it can be counter-intuitive. basically says, if A is true, then so is B, otherwise B can be either true or false.
Since each term can only take on two values, all possibilities can easily be enumerated in a so-called truth table:
The next step is to connect these sentences, using connectives, to make more complex sentences, such as or . In the last sentence, the brackets can be omitted, since is the same as . However, when in doubt, it's best to use brackets to make the meaning of the sentence completely clear.
You can analyse complex sentences with truth tables as well:
We can now divide sentences in to three groups: valid, unsatisfiable and satisfiable.
- Valid sentences (aka tautologies) are always true, no matter what values their terms take.
Examples of valid sentences include
- A or (not A)
- A => A
- (A => B) or (A and (not B))
- Unsatisfiable sentences (aka inconsistencies) are always false, no matter what values their terms take.
Examples of unsatisfiable sentences include
- A and (not A)
- (A => B) and (A and (not B))
- Satisfiable sentences (aka contingencies) are those that can be either true or false, depending on the values that their terms take.
Examples of satisfiable sentences include
- A or B
- A and B
Meaning and Intention
It's very important in logical languages to realize that these sentences can be used in different ways. , for instance, does not imply any meaning on its own. It's just a formal way of creating logical constructions. Someone can state that is true, which would give the sentence a meaning (namely that A and B are both true), which can be used to derive further truths if other things are known about A and B. Someone might also ask if is true, to which the person asked this would have to find an answer based on things already known about A and B. In other words, a logical sentence on it's own doesn't mean anything. The reader needs to know the intention behind the sentence (usually question or statement) to be able to do something with it. A common construct in logic is a knowledge base, a collection of sentences that are stated to be true, and a single sentence that is posed as a question. The question is whether the question is true, given the knowledge base. Consider, for instance, the following knowledge base:
With the question
That is, is A true, given that the Knowledge base is. It's clear that the question is indeed true, since is true, and B is too. This knowledge base/question construction is in fact the way that prolog works. You write a knowledge base (your program) and ask prolog a question. In comparison to conventional programming languages, the knowledgebase is your program, the question is its input and prolog resolving your question is the running of the program.
First Order Logic
First Order Logic (also known as predicate logic) expands on propositional logic, by using predicates, variables and objects. In propositional logic, the atomic sentences (the smallest elements that can take on a true/false value) are terms, symbols represented by letters. In first order logic the atomic sentences are predicates. Predicates have a name (starting with a capital) which is followed by several variables (starting with a lowercase letter). The following are examples of predicates:
- Predicate(variable1, variable2)
- BrotherOf(sibling, brother)
- MotherOf(child, mother)
These variables can be instantiated with objects. Objects are elements represented by words that start with a capital letter. For instance, in the predicate the variable thing can be instantiated with the objects Car, Bike, or Banana. Based on the instantiation of the variables, the predicate is true or false ( is true whereas is false). Note however that these names are for readability only, they do not actually mean anything. is not functionally different from , or indeed . Whether is true or false needs to be defined in some formal way (such as a knowledge base, which is described below).
These predicates can be joined in sentences, just like the terms in propositional logic, using connectives (the connectives are the same as in propositional logic). Usually there is a collection of sentences that are assumed to be true, to create a logical definition of predicates. Such a collection of sentences that are true is called a knowledge base. Such a knowledge base could, for instance contain the following sentences:
The sentences tell us that the HasWheels predicate is true, if its first element is car; and the MotherOf predicate is true, if its first element is Charles and the second is Elizabeth. To construct this kind of sentences with variables in them we need to state what exactly we mean when we use the variables. If HasWheels(x) is true, do we mean it's true for instantiations of x or that there exists an instantiation of x that makes HasWheels(x) true? To define this we use quantifiers, ie. they determine the quantity of a variable. First order logic has two quantifiers, the universal quantifier and the existential quantifier . These quantifiers are placed before a variable to signify what the variable means in the sentence that follows the quantifier. For instance, the sentence means that for all possible instantiations of x, HasWheels(x) is true, that is, all possible objects have wheels. The sentence means that there exists at least one object x for which HasWheels(x) is true, in other words there is at least one thing that has wheels. To understand the use of the quantifiers, consider the following examples:
- If x is a land vehicle, then x has wheels. (if x is not a landvehicle, this sentence says nothing about x)
- If x has a child y and x is a man, x is the father of y.
- There exists at least one object that has wheels and isn't a car
- All mothers have a child
Logic in Prolog
The logic used in prolog is a version of first order logic, with the use of capital letters inverted (predicates and objects start with a lowercase letter, variables start with an uppercase letter). A prolog program consists of a knowledge base where each sentence is a conjunction of predicates connected to a final predicate with an implication. For instance:
A sentence like this is called a Horn Clause. In prolog the above sentence would look like this:
pred4(A) :- pred1(A, B), pred2(B, C), pred3(C, D).
Note that the implication sign is reversed, commas are used for conjunction, a period is used to end the sentence and all variables are assumed to be universally quantified.
(x) Write out a truth table for the following sentences in propositional logic.
(x) How many connectives are possible, that connect two terms? Why?
(x) Try to find a formula to fit the following truth tables
(x) Truth tables are a great way to prove that a propositional formula is true. Could you do the same thing for first order logic? Explain how, or why not.
(x) Convert the following sentences to first order logic. Try to follow the logical structure of the sentence closely (using objects for individuals, variables for groups of people, connectives for logical constructions and predicates for the rest).
a) All kids are short.
b) Certain kids own shoes.
b) If someone is a kid and a boy, he likes cars.
d) All kids that own shoes, wear them.
e) All kids have a mother.
f) If a woman is a mother, she has a kid.
g) No kid likes a vegetable if it's overcooked.
h) No mother likes a teacher if he punishes her kid.
(x) (advanced)The following questions concern the = symbol. It takes two variables and is true if they are bound to the same thing, in other words x = y is true if x and y represent the same object.
(a) Is the = symbol a function, predicate or a connective? Why?
(b) The = symbol shouldn't be confused with the equality connective. How are the different?
(c) Can you think of a sentence in first order logic that, when added to a knowledge base (and thus considered always true) does the same thing as the = symbol. That is, through it's definition in the knowledge base, this sentence, with 'inputs' x and y, is true if x and y are equal.
(d) The existential quantifier defines that a sentence is true if it's true for at least one possible instantiation of x. Can you think of a way to quantify a variable x for a sentence so that the sentence is true if it's true for only one instantiation of x, but no more? You'll probably need the = symbol for this.