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 ...
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