# Week 35

## Announcements

There is no official printed course book. I supply lecture notes covering the course on Blackboard under "Course Documents".

For the part on logic programming, the book *Logic, Programming and Prolog* can
be obtained free of charge from the
web site of Ulf Nilsson.
This book covers the contents of the course from a more theoretical starting
point.

For the part on functional programming, the book *Real World Haskell* is
avilable from its website.
This book covers the practical aspects of programming in Haskell and is
a nice read in case you want to expand your practical command of Haskell.

## Lecture Wednesday (29.08.2012)

The first lecture will start with a short introduction about programming languages focusing on the differences between imperative and declarative languages.

The main part of the lecture will be an introduction to the logic programming language Prolog.

##### Topics

course organization, declarative languages, facts, queries, rules

##### Reading

Chapter 1 and Section 2.1 in Lecture Notes in Blackboard (Course Documents)

## Exercise Wednesday (29.08.2012)

The file family.pl contains a
slightly extended version of the knowledge base from the lecture.
That is, you can assume that the following predicates are fully defined:
`
`

- female(X) % true if X is female
- male(X) % true if X is male
- married(X,Y) % true if X is married to Y
- motherOf(X,Y) % true if X is the mother of Y
- diff(X,Y) % true if X and Y are instantiated with different objects

1) Write clauses that define the following predicates:
`
`

- fatherOf(X,Y) % true if X is father of Y
- parent(X,Y) % true if X is parent of Y
- siblings(X,Y) % true if X and Y are siblings
- sisters(X,Y) % true if X and Y are sisters
- isFather(X) % true if X is a father
- isMother(X) % true if X is a mother
- isSibling(X) % true if X is a sibling
- isBrother(X) % true if X is a brother
- granddad(X,Y) % true if X is grandfather of Y
- uncle(X,Y) % true if X is uncle of Y
- cousin(X,Y) % true if X is cousin of Y
- descendant(X,Y) % true if X is descendant of Y

2) Try to produce all answers of `isMother(X).` by
repeatedly pressing semicolon. Do you see any answer ocurring more
than once? What is the reason?

3) How does the behaviour of `diff` change if we replace
`\==` by `\=` in its defining rule? Do your
predicates using `diff` still work?

## Lecture Friday (31.08.2012)

The second lecture will formalize Prolog evaluation and focus on unification. At the end, we will introduce predicate logic.

##### Topics

Prolog evaluation, unification, Robinson's algorithm, termination of Robinson's algorithm, SLD tree, predicate logic

##### Reading

Section 2.2 and first subsection of Section 2.3 in Lecture Notes in Blackboard (Course Documents)