29.12.2013 Views

An Introduction to Language Processing with Perl and Prolog - A ...

An Introduction to Language Processing with Perl and Prolog - A ...

An Introduction to Language Processing with Perl and Prolog - A ...

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Language</strong> Technology<br />

<br />

<strong>An</strong> <strong>Introduction</strong> <strong>to</strong> <strong>Language</strong> <strong>Processing</strong> <strong>with</strong> <strong>Perl</strong> <strong>and</strong><br />

<strong>Prolog</strong><br />

A Short <strong>Introduction</strong> <strong>to</strong> <strong>Prolog</strong><br />

Pierre Nugues<br />

Lund University<br />

Pierre.Nugues@cs.lth.se<br />

http://cs.lth.se/pierre_nugues/<br />

Pierre Nugues <strong>An</strong> <strong>Introduction</strong> <strong>to</strong> <strong>Language</strong> <strong>Processing</strong> <strong>with</strong> <strong>Perl</strong> <strong>and</strong> <strong>Prolog</strong> 1 / 19


Facts<br />

<strong>Language</strong> Technology<br />

A Short <strong>Introduction</strong> <strong>to</strong> <strong>Prolog</strong><br />

character(priam, iliad).<br />

character(hecuba, iliad).<br />

character(achilles, iliad).<br />

% Male characters % Female characters<br />

male(priam).<br />

female(hecuba).<br />

male(achilles).<br />

female(<strong>and</strong>romache).<br />

male(agamemnon). female(helen).<br />

male(patroclus). female(penelope).<br />

male(hec<strong>to</strong>r).<br />

male(rhesus).<br />

male(ulysses).<br />

male(menelaus).<br />

male(telemachus).<br />

male(laertes).<br />

male(nes<strong>to</strong>r).<br />

character(ulysses, odyssey).<br />

character(penelope, odyssey).<br />

character(telemachus, odyssey).<br />

Pierre Nugues <strong>An</strong> <strong>Introduction</strong> <strong>to</strong> <strong>Language</strong> <strong>Processing</strong> <strong>with</strong> <strong>Perl</strong> <strong>and</strong> <strong>Prolog</strong> 2 / 19


More Facts<br />

<strong>Language</strong> Technology<br />

A Short <strong>Introduction</strong> <strong>to</strong> <strong>Prolog</strong><br />

% Fathers % Mothers<br />

father(priam, hec<strong>to</strong>r). mother(hecuba, hec<strong>to</strong>r).<br />

father(laertes,ulysses). mother(penelope,telemachus).<br />

father(atreus,menelaus). mother(helen, hermione).<br />

father(menelaus, hermione).<br />

father(ulysses, telemachus).<br />

king(ulysses, ithaca, achaean).<br />

king(menelaus, sparta, achaean).<br />

king(agamemnon, argos, achaean).<br />

king(priam, troy, trojan).<br />

A <strong>Prolog</strong> fact corresponds <strong>to</strong>:<br />

relation(object1, object2, ..., objectn).<br />

Pierre Nugues <strong>An</strong> <strong>Introduction</strong> <strong>to</strong> <strong>Language</strong> <strong>Processing</strong> <strong>with</strong> <strong>Perl</strong> <strong>and</strong> <strong>Prolog</strong> 3 / 19


term.<br />

<strong>Language</strong> Technology A Short <strong>Introduction</strong> <strong>to</strong> <strong>Prolog</strong><br />

It is common <strong>to</strong> use trees <strong>to</strong> represent compound terms. The nodes of a tree are<br />

Terms<br />

then equivalent <strong>to</strong> the func<strong>to</strong>rs of a term. Figure A.1 shows examples of this.<br />

Terms<br />

male(ulysses)<br />

Graphical representations<br />

male<br />

ulysses<br />

father(ulysses, telemachus)<br />

father<br />

ulysses<br />

telemachus<br />

character(ulysses, odyssey, king(ithaca, achaean))<br />

character<br />

ulysses odyssey king<br />

ithaca<br />

achaean<br />

Fig. A.1. Graphical representations of terms.<br />

Pierre Nugues <strong>An</strong> <strong>Introduction</strong> <strong>to</strong> <strong>Language</strong> <strong>Processing</strong> <strong>with</strong> <strong>Perl</strong> <strong>and</strong> <strong>Prolog</strong> 4 / 19


Queries<br />

<strong>Language</strong> Technology<br />

A Short <strong>Introduction</strong> <strong>to</strong> <strong>Prolog</strong><br />

Is Ulysses a male?<br />

?- male(ulysses).<br />

Yes<br />

Is Penelope a male?<br />

?- male(penelope).<br />

No<br />

Is Menelaus a male <strong>and</strong> is he the king of Sparta <strong>and</strong> an Achaean?<br />

?- male(menelaus), king(menelaus, sparta, achaean).<br />

Yes<br />

Pierre Nugues <strong>An</strong> <strong>Introduction</strong> <strong>to</strong> <strong>Language</strong> <strong>Processing</strong> <strong>with</strong> <strong>Perl</strong> <strong>and</strong> <strong>Prolog</strong> 5 / 19


Variables<br />

<strong>Language</strong> Technology<br />

A Short <strong>Introduction</strong> <strong>to</strong> <strong>Prolog</strong><br />

Characters of the Odyssey<br />

?- character(X, odyssey).<br />

X = ulysses<br />

What is the city <strong>and</strong> the party of king Menelaus? etc.<br />

?- king(menelaus, X, Y).<br />

X = sparta, Y = achaean<br />

?- character(menelaus, X, king(Y, Z)).<br />

X = iliad, Y = sparta, Z = achaean<br />

?- character(menelaus, X, Y).<br />

X = iliad, Y = king(sparta, achaean)<br />

Pierre Nugues <strong>An</strong> <strong>Introduction</strong> <strong>to</strong> <strong>Language</strong> <strong>Processing</strong> <strong>with</strong> <strong>Perl</strong> <strong>and</strong> <strong>Prolog</strong> 6 / 19


Multiple Solutions<br />

<strong>Language</strong> Technology<br />

A Short <strong>Introduction</strong> <strong>to</strong> <strong>Prolog</strong><br />

All the males:<br />

?- male(X).<br />

X = priam ;<br />

X = achilles ;<br />

...<br />

No<br />

Pierre Nugues <strong>An</strong> <strong>Introduction</strong> <strong>to</strong> <strong>Language</strong> <strong>Processing</strong> <strong>with</strong> <strong>Perl</strong> <strong>and</strong> <strong>Prolog</strong> 7 / 19


Shared Variables<br />

<strong>Language</strong> Technology<br />

A Short <strong>Introduction</strong> <strong>to</strong> <strong>Prolog</strong><br />

Is the king of Ithaca also a father?<br />

?- king(X, ithaca, Y), father(X, Z).<br />

X = ulysses, Y = achaean, Z = telemachus<br />

The anonymous variable _:<br />

?- king(X, ithaca, _), father(X, _).<br />

X = ulysses<br />

Pierre Nugues <strong>An</strong> <strong>Introduction</strong> <strong>to</strong> <strong>Language</strong> <strong>Processing</strong> <strong>with</strong> <strong>Perl</strong> <strong>and</strong> <strong>Prolog</strong> 8 / 19


Rules<br />

<strong>Language</strong> Technology<br />

A Short <strong>Introduction</strong> <strong>to</strong> <strong>Prolog</strong><br />

Derive information from facts:<br />

son(X, Y) :- father(Y, X), male(X).<br />

son(X, Y) :- mother(Y, X), male(X).<br />

HEAD :- G1, G2, G3, ... Gn.<br />

?- son(telemachus, Y).<br />

Y = ulysses;<br />

Y = penelope;<br />

No<br />

parent(X, Y) :- mother(X, Y).<br />

parent(X, Y) :- father(X, Y).<br />

Pierre Nugues <strong>An</strong> <strong>Introduction</strong> <strong>to</strong> <strong>Language</strong> <strong>Processing</strong> <strong>with</strong> <strong>Perl</strong> <strong>and</strong> <strong>Prolog</strong> 9 / 19


Recursive Rules<br />

<strong>Language</strong> Technology<br />

A Short <strong>Introduction</strong> <strong>to</strong> <strong>Prolog</strong><br />

gr<strong>and</strong>parent(X, Y) :- parent(X, Z), parent(Z, Y).<br />

gr<strong>and</strong>_gr<strong>and</strong>parent(X, Y) :-<br />

parent(X, Z), parent(Z, W), parent(W, Y).<br />

ances<strong>to</strong>r(X, Y) :- parent(X, Y).<br />

ances<strong>to</strong>r(X, Y) :- parent(X, Z), ances<strong>to</strong>r(Z, Y).<br />

?- ances<strong>to</strong>r(X, hermione).<br />

X= menelaus;<br />

X = helen;<br />

X = atreus;<br />

No<br />

Pierre Nugues <strong>An</strong> <strong>Introduction</strong> <strong>to</strong> <strong>Language</strong> <strong>Processing</strong> <strong>with</strong> <strong>Perl</strong> <strong>and</strong> <strong>Prolog</strong> 10 / 19


Unification<br />

<strong>Language</strong> Technology<br />

A Short <strong>Introduction</strong> <strong>to</strong> <strong>Prolog</strong><br />

<strong>Prolog</strong> uses unification in queries <strong>to</strong> match a goal <strong>and</strong> in term equation<br />

T1 = T2.<br />

T1 = character(ulysses, Z, king(ithaca, achaean))<br />

T2 = character(ulysses, X, Y)<br />

504 A <strong>An</strong> <strong>Introduction</strong> <strong>to</strong> <strong>Prolog</strong><br />

character<br />

=<br />

character<br />

ulysses Z king<br />

ulysses X Y<br />

ithaca<br />

achaean<br />

Fig. A.3. Unification of terms: a graphical interpretation.<br />

Pierre Nugues <strong>An</strong> <strong>Introduction</strong> <strong>to</strong> <strong>Language</strong> <strong>Processing</strong> <strong>with</strong> <strong>Perl</strong> <strong>and</strong> <strong>Prolog</strong> 11 / 19


Lists<br />

<strong>Language</strong> Technology<br />

A Short <strong>Introduction</strong> <strong>to</strong> <strong>Prolog</strong><br />

Lists are useful data structures<br />

Examples of lists:<br />

[a] is a list made of an a<strong>to</strong>m<br />

[a, b] is a list made of two a<strong>to</strong>ms<br />

[a, X, father(X, telemachus)] is a list made of an a<strong>to</strong>m, a<br />

variable, <strong>and</strong> a compound term<br />

[[a, b], [[[father(X, telemachus)]]]] is a list made of two<br />

sublists<br />

[] is the a<strong>to</strong>m representing the empty list.<br />

Pierre Nugues <strong>An</strong> <strong>Introduction</strong> <strong>to</strong> <strong>Language</strong> <strong>Processing</strong> <strong>with</strong> <strong>Perl</strong> <strong>and</strong> <strong>Prolog</strong> 12 / 19


<strong>Language</strong> Technology<br />

Head <strong>and</strong> Tail of a List<br />

A Short <strong>Introduction</strong> <strong>to</strong> <strong>Prolog</strong><br />

It is often necessary <strong>to</strong> get the head <strong>and</strong> tail of a list:<br />

?- [a, b] = [H | T].<br />

H = a, T = [b]<br />

?- [a] = [H | T].<br />

H = a, T = []<br />

?- [a, [b]] = [H | T].<br />

H = a, T = [[b]]<br />

The empty list can’t be split:<br />

?- [] = [H | T].<br />

No<br />

Pierre Nugues <strong>An</strong> <strong>Introduction</strong> <strong>to</strong> <strong>Language</strong> <strong>Processing</strong> <strong>with</strong> <strong>Perl</strong> <strong>and</strong> <strong>Prolog</strong> 13 / 19


<strong>Language</strong> Technology<br />

The member/2 List Predicate<br />

A Short <strong>Introduction</strong> <strong>to</strong> <strong>Prolog</strong><br />

member/2 checks whether an element is a member of a list:<br />

?- member(a, [b, c, a]).<br />

Yes<br />

?- member(a, [c, d]).<br />

No<br />

member/2 can be queried <strong>with</strong> variables <strong>to</strong> generate elements member of a<br />

list as in:<br />

?- member(X, [a, b, c]).<br />

X = a ;<br />

X = b ;<br />

X = c ;<br />

No.<br />

Pierre Nugues <strong>An</strong> <strong>Introduction</strong> <strong>to</strong> <strong>Language</strong> <strong>Processing</strong> <strong>with</strong> <strong>Perl</strong> <strong>and</strong> <strong>Prolog</strong> 14 / 19


<strong>Language</strong> Technology<br />

The member/2 Definition<br />

A Short <strong>Introduction</strong> <strong>to</strong> <strong>Prolog</strong><br />

member/2 is defined as<br />

member(X, [X | Y]). % Termination case<br />

member(X, [Y | YS]) :- % Recursive case<br />

member(X, YS).<br />

We could also use anonymous variables <strong>to</strong> improve legibility <strong>and</strong> rewrite<br />

member/2 as<br />

member(X, [X | _]).<br />

member(X, [_ | YS]) :- member(X, YS).<br />

Pierre Nugues <strong>An</strong> <strong>Introduction</strong> <strong>to</strong> <strong>Language</strong> <strong>Processing</strong> <strong>with</strong> <strong>Perl</strong> <strong>and</strong> <strong>Prolog</strong> 15 / 19


<strong>Language</strong> Technology<br />

The append/3 List Predicate<br />

A Short <strong>Introduction</strong> <strong>to</strong> <strong>Prolog</strong><br />

append/3 appends two lists <strong>and</strong> unifies the result <strong>to</strong> a third argument:<br />

?- append([a, b, c], [d, e, f], [a, b, c, d, e, f]).<br />

Yes<br />

?- append([a, b], [c, d], [e, f]).<br />

No<br />

?- append([a, b], [c, d], L).<br />

L = [a, b, c, d]<br />

?- append(L, [c, d], [a, b, c, d]).<br />

L = [a, b]<br />

?- append(L1, L2, [a, b, c]).<br />

L1 = [], L2 = [a, b, c] ;<br />

L1 = [a], L2 = [b, c] ; etc.<br />

<strong>with</strong> all the combinations.<br />

Pierre Nugues <strong>An</strong> <strong>Introduction</strong> <strong>to</strong> <strong>Language</strong> <strong>Processing</strong> <strong>with</strong> <strong>Perl</strong> <strong>and</strong> <strong>Prolog</strong> 16 / 19


<strong>Language</strong> Technology<br />

The append/3 Definition<br />

A Short <strong>Introduction</strong> <strong>to</strong> <strong>Prolog</strong><br />

append/3 is defined as<br />

append([], L, L).<br />

append([X | XS], YS, [X | ZS]) :-<br />

append(XS, YS, ZS).<br />

Pierre Nugues <strong>An</strong> <strong>Introduction</strong> <strong>to</strong> <strong>Language</strong> <strong>Processing</strong> <strong>with</strong> <strong>Perl</strong> <strong>and</strong> <strong>Prolog</strong> 17 / 19


<strong>Language</strong> Technology<br />

Searching the Minotaur<br />

A Short <strong>Introduction</strong> <strong>to</strong> <strong>Prolog</strong><br />

532 A <strong>An</strong> <strong>Introduction</strong> <strong>to</strong> <strong>Prolog</strong><br />

link(r1, r2). link(r1, r3).<br />

link(r1, r4). link(r1, r5).<br />

link(r2, r6). link(r2, r7).<br />

link(r3, r6). link(r3, r7).<br />

link(r4, r7). link(r4, r8).<br />

link(r6, r9).<br />

Room 1<br />

Room 2<br />

Room 3<br />

Room 4<br />

Room 6<br />

Room 7<br />

Room 8<br />

Room 9<br />

Room 5<br />

Since links can be traversed both ways, the s/2 predicate is:<br />

s(X, Y) :- link(X, Y).<br />

s(X, Y) :- link(Y, X).<br />

<strong>An</strong>d minotaur(r8).<br />

where<br />

goal(X) :- minotaur(X).<br />

minotaur(r8).<br />

Fig. A.9. The graph representing the labyrinth.<br />

Finally, we could associate a cost <strong>to</strong> the link, for instance, <strong>to</strong> take in<strong>to</strong> acco<br />

Pierre Nugues <strong>An</strong> <strong>Introduction</strong> <strong>to</strong> <strong>Language</strong> <strong>Processing</strong> length. The predicate <strong>with</strong> <strong>Perl</strong> would <strong>and</strong>then <strong>Prolog</strong> be:<br />

18 / 19


Depth-First Search<br />

<strong>Language</strong> Technology<br />

A Short <strong>Introduction</strong> <strong>to</strong> <strong>Prolog</strong><br />

%% depth_first_search(+Node, -Path)<br />

depth_first_search(Node, Path) :-<br />

depth_first_search(Node, [], Path).<br />

%% depth_first_search(+Node, +CurrentPath, -FinalPath)<br />

depth_first_search(Node, Path, [Node | Path]) :-<br />

goal(Node).<br />

depth_first_search(Node, Path, FinalPath) :-<br />

s(Node, Node1),<br />

\+ member(Node1, Path),<br />

depth_first_search(Node1, [Node | Path], FinalPath).<br />

The goal is expressed as: goal(X) :- minotaur(X).<br />

Pierre Nugues <strong>An</strong> <strong>Introduction</strong> <strong>to</strong> <strong>Language</strong> <strong>Processing</strong> <strong>with</strong> <strong>Perl</strong> <strong>and</strong> <strong>Prolog</strong> 19 / 19

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!