Вы находитесь на странице: 1из 39

Universidade de Braslia

CIC 316024
Inteligncia Artificial I

Dr. Li Weigang (weigang@unb.br)


Maro de 2016

Informtica - CIC

Prolog Processamento de Listas


Tpico
LPA WIN-PROLOG 4.7
http://www.lpa.co.uk/win.htm
Processamento de Listas

LPA WIN-PROLOG 4.7


WIN-PROLOG is the leading Prolog compiler
system for Windows-based PCs. Prolog is an
established and powerful AI language which
provides a high-level and productive
environment based on logical inference.

LPA WIN-PROLOG 5.0

http://www.lpa.co.uk/win.htm

LPA WIN-PROLOG 4.7


Musical Instrument Digital Interface (MIDI)
Comprehensive support for the Musical Instrument Digital
Interface (MIDI) opens up a whole new world of
experimental research and analysis of music, something to
which Prolog's inherent pattern matching is well suited. Not
only can MIDI sequences be captured and replayed in real
time, but special low-level timers and message handlers
mean that WIN-PROLOG programs can perform
sophisticated transformations and complex manipulations of
musical data and system exclusive dumps without
interrupting or affecting the accuracy of recording and
playback.

LPA WIN-PROLOG 4.7


Built-in Winsock TCP/IP Support
Creating intelligent Internet applications has never
been easier, whether you are simply pulling
resources down from websites, or writing complex
client/server distributed applications, thanks to the
new built-in Windows Sockets (Winsock) support
in WIN-PROLOG. Everything you need to write
TCP/IP applications is built right into the WINPROLOG kernel, and you can extend this
functionality even further by purchasing the brand
new toolkit, Chimera Agents for WIN-PROLOG.

LPA WIN-PROLOG 4.7


Prolog in Full Colour!
WIN-PROLOG makes programming in
Prolog easier than ever, thanks to its
powerful "Rich Syntax Colouring", which
identifies variables, numbers, strings,
predicates, etc., in real time during editing
and query entry.

LPA WIN-PROLOG 4.7

LPA WIN-PROLOG 4.7


In-Depth Unicode Support
WIN-PROLOG automatically handles
Unicode, the international standard character
encoding system which allows all world
languages to be represented on screen, in
print and as files: moreover, it does this
transparently, and without penalising ASCII
text files, programs and applications.

LPA WIN-PROLOG 4.7

LPA WIN-PROLOG 4.7


In-Depth Unicode Support
WIN-PROLOG automatically handles
Unicode, the international standard character
encoding system which allows all world
languages to be represented on screen, in
print and as files: moreover, it does this
transparently, and without penalising ASCII
text files, programs and applications.

LPA WIN-PROLOG 4.7


Easy Customisation
Whether changing the colours used in Rich Syntax
Colouring, or simply tweaking the behaviour of
debuggers and compilers, WIN-PROLOG is easily
customised through a collection of preferences and
configuration dialogs.
Settings can be local to a single session, or stored
between sessions: even the commands you type in
during a given session can optionally be saved and
reloaded into the command history next time you
run WIN-PROLOG, saving time and avoiding
errors, especially during the edit/debug
development cycle.

LPA WIN-PROLOG 4.7

LPA WIN-PROLOG 4.7


Powerful Metatools
A powerful and ever expanding set of
metatools lets you search for files containing
definitions of or calls to specific predicates,
display your code as a graphical call graph,
cross reference your code to discover
undefined or redundant predicates, and
more.

LPA WIN-PROLOG 4.7


Extensive Cross-Platform Compatibility
WIN-PROLOG shares the same underlying 32-bit inference
engine and architecture as LPA DOS-PROLOG and LPA
MacProlog32, and is closely compatible with both the ISO
Prolog and Quintus Prolog for Unix. There is a powerful bidirectional DLL interface which allows code written in C,
C++, Pascal etc to be accessed and a configurable DDE for
linking with other applications (Excel, Word, Visual Basic
etc). WIN-PROLOG includes full Unicode support, an
attractive multi-window development environment,
interactive source-level debugger, integrated editor and
high-level access to Windows GUI functions.

LPA WIN-PROLOG 4.7


WIN-PROLOG and its Toolkits
WIN-PROLOG is the central product in a series that
consists of programming tools that works cross-platform on
Windows XP, 2000, NT, ME and 98; the series also includes
flex, Prolog++, Chimera Agents for WIN-PROLOG, the
Portable Dialog Manager, and the ProData Database
Interface toolkit. These products have access to all the
memory available to Windows without restriction. The
Windows series uses incremental compilation of user
programs to provide the execution speed of a compiler but
with the interactive behaviour of an interpreter. A hashing
compiler provides lightning fast indexing into large data
relations, while an optimizing compiler provides multipleargument indexing for static code.

Processamento de Listas
Lista - seqncia ordenada de elementos que pode ter
qualquer comprimento.
Os elementos de uma lista podem ser uma varivel, uma
constante, ou qualquer estrutura do Prolog. Esses elementos
so separados por vrgulas.
Formas de identificao das listas em Prolog:
[X|Y]
[ Cabea | Cauda ]
[ Topo | Cauda ]
[ Primeiro | Resto ]

A Cauda pode ser uma lista vazia.

Processamento de Listas - Exemplo


Lista

Cabea

Cauda

[casa]

[casa]

[]

[3, 4, 5]

[3]

[4, 5]

[ o, gato, morreu, ontem ]

[o]

[gato, morreu,ontem]

Processamento de Listas
Construo de Listas
cons(X,Y,[X|Y]).
?-cons(a,b,Z).
Z=[a,b] ou Z=[a|b]
?-cons(a,[],Z).
Z=[a]
?-cons(a,X,[a,b,c]).
X=[b,c]
?-cons([a,b,c],[d,e],Z).
Z = [[a,b,c],d,e]

Elementos de uma Lista


membro(X,L).
membro(b,[a,b,c]).
membro([b,c],[a,[b,c],d]).
membro(b,[a,[b,c]]). (Falso)
X membro de L se
1. X a cabea de L, ou
2. X membro do corpo de L

Elementos de uma Lista


membro(X,[X|C]).
membro(X,[_|C]) :- membro(X,C).
?-membro(a,[a,b,c]).
yes

O uso de _ indica
que o contedo
no importante.

?-membro(Natal, [Recife, Natal, Campina]).


yes
?-membro(1,[[1,2],3,4]).
no

Processamento de Listas
Unificao de Listas (matching)
Dados dois termos, diz-se que eles se unificam se:
1.

So idnticos ou

2.

As variveis em ambos os termos podem ser


instanciadas em objetos, de maneira que aps a
substituio das variveis por esses objetos, os
termos se tornam idnticos.

Processamento de Listas
Unificao de Listas

A unificao de uma lista [X | Y] com X e


Y variveis, com uma lista do tipo [ a1, a2,
a3, ..., an ] resulta em:
{ X/a1, Y/[ a2, a3, ..., an ]} ,
{ X/a1, Y/[ ]}
,

se n > 1
se n = 1

Processamento de Listas-Exemplo
Lista 1

Lista 2

Unificao

[mesa]

[X|Y]

X/mesa
Y/ [ ]

[a,b,c,d]

[ X, Y | Z ]

X/a
Y/b
Z/[c,d]

[ano, bissexto]

[ X, Y, Z]
[X, Y | Z]

no unifica
X/ano
Y/bissexto
Z/[ ]

Processamento de Listas
Elementos de uma lista:
pertence(Elemento, Lista)

o Elemento pertence a Lista se ele a cabea da Lista ou


o Elemento pertence cauda da Lista.

pertence(Elemento, [Elemento | _ ]).


pertence(Elemento, [ _ |Cauda]) :pertence(Elemento, Cauda).

Processamento de Listas
ltimo elemento de uma lista:
ultimo(Lista, Elemento)

se a Lista tem s um elemento, este o ltimo Elemento.


o ltimo elemento de uma Lista com mais de um
elemento o ltimo elemento da Cauda da Lista.

ultimo([Elemento], Elemento).
ultimo([ _ | Cauda], Elemento):- ultimo(Cauda,
Elemento).

Processamento de Listas
Soma dos elementos de uma lista numrica:
soma( Lista, S)
se a Lista vazia, a soma dos elementos zero.
se a Lista [Cabea | Cauda], a soma dos elementos
a soma dos elementos da Cauda mais a Cabea.

soma([ ], 0).
soma([Cabea | Cauda], S):- soma(Cauda, S1),
S is S1 + Cabea.

Processamento de Listas
Elementos consecutivos em uma lista
consecutivos( Elemento1, Elemento2, Lista)

dois elementos Elemento1 e Elemento2 so consecutivos


se eles so o primeiro e o segundo elementos da Lista.
ou se so consecutivos na cauda da Lista.

consecutivos(Elemento1, Elemento2, [Elemento1,


Elemento2 | Cauda]).
consecutivos(Elemento1, Elemento2, [ _ | Cauda]):consecutivos(Elemento1, Elemento2, Cauda).

Processamento de Listas
conc(L1,L2,L3)

L1 e L2 so duas listas e L3 a concatenao resultante.

conc([a,b],[c,d],[a,b,c,d]).
Casos que devem ser considerados para a definio
de conc/3:
1.
2.

Se o primeiro argumento uma lista vazia - o segundo e o


terceiro argumentos devem ser a mesma lista.
Se o primeiro argumento no for uma lista vazia - pode ser
denotado por [X|L1]. A concatenao de [X|L1] com L2
uma terceira lista com a mesma cabea X da primeira e um
corpo L3 que a concatenao do corpo de L1 com L2.

Concatenao de Listas
X
X

L1

L2
L3

Exemplo:
conc([ ],L,L).
conc([X|L1],L2,[X|L3]) :- conc(L1,L2,L3).
?-conc([a,b,c],[1,2,3],L).
L=[a,b,c,1,2,3]
?-conc([a,[b,c],d],[a,[],b],L).
L=[a,[b,c],d,a,[ ],b]

Concatenao de Listas
Apesar de muito simples o programa conc/3 pode ser usado
em inmeras aplicaes:
Decomposio:
Exemplo: ?-conc(L1,L2,[a,b,c]).
L1 = [ ] ,
L2 = [a,b,c] ;
L1 = [a] ,
L2 = [b,c] ;
L1 = [a,b] ,
L2 = [c] ;
L1 = [a,b,c] ,
L2 = [] ;
no

Concatenao de Listas
Apagando de uma lista todos os elementos
que se seguem a um determinado padro:
Exemplo:
?-conc(T,[sab|_],[seq,ter,qua,qui,sex,sab,dom]).
T=[seg,ter,qua,qui,sex]

Remoo de Elementos de uma Lista


remover(X,L,L1)

L1 a mesma lista L com o elemento X removido.

Existem novamente 2 casos a estudar:


1. Se X a cabea de L, ento L1 ser seu corpo.
2. Se X est no corpo de L, ento L1 obtida removendo X
desse corpo.
Exemplo:
remover(X,[X|C],C).
remover(X,[Y|C],[Y|D]):-remover(X,C,D).

Exemplos de remoo
?-remover(a,[a,b,a,a],L).
L=[b,a,a];
L=[a,b,a];
L=[a,b,a];
no

?-remover(a,L,[b,c,d]).
L=[a,b,c,d];
L=[b,a,c,d];
L=[b,c,a,d];
L=[b,c,d,a];
no

Outros usos de remover/3


remover(X,[X|C],C).
remover(X,[Y|C],[Y|D]):-remover(X,C,D).
inserir(X,L,L1):- remover(X,L1,L).
membro2(X,L) :- remover(X,L,_).
Exemplo:
?-inserir(a,[b,c],L).
L=[a,b,c];
L = [b,a,c] ;
L = [b,c,a] ;
no

?-membro2(a,[c,b,a]).
yes

Inverso de Listas
inverter([a,b,c],[c,b,a]).
inverter([],[]).
inverter([a,[b,c],d],[d,[b,c],a]).
Inverso ingnua (O(N2))
1. Tomar o primeiro elemento da lista
2. Inverter o restante
3. Concatenar o inverso do restante lista formada pelo
primeiro elemento
inverter([],[]).
inverter([X|Y],Z) :- inverter(Y,Y1),
conc(Y1,[X],Z).

Inverso de Listas
Inverso eficiente (O(N))
inverter(X,Y):-aux([],X,Y).
aux(L,[ ],L).
aux(L,[X|Y],Z) :- aux([X|L],Y,Z).

Sublistas
S uma sublista de L se:
(1) L pode ser decomposta em duas listas L1 e L2
(2) L2 pode ser decomposta em S e L3
sublista(S,L) :- conc(L1,L2,L),
conc(S,L3,L2).
?-sublista(S,[a,b,c]).

Sublistas
Exemplo:
?-sublista(S,[a,b,c]).
S = [ ] ;
S = [a] ;
S = [a,b] ;
S = [a,b,c] ;
S = [ ] ;
S = [b] ;
S = [b,c] ;
S = [ ] ;
S = [c] ;
S = [ ] ;
no

conc([ ],L,L).
conc([X|L1],L2,[X|L3]) :conc(L1,L2,L3).
sublista(S,L) :conc(L1,L2,L),
conc(S,L3,L2).