Sie sind auf Seite 1von 30

TabladeContenidos

1 Introduccin_________________________________________________________ 3
2 Hechos ______________________________________________________________ 3
3 Reglas ______________________________________________________________ 3
3.1
3.2
3.3
3.4
3.5

Reglassimples ______________________________________________________ 3
ReglasconVariables _________________________________________________ 4
ReglasRecursivas ___________________________________________________ 4
Utilizacindefunciones _______________________________________________ 4
DatosCompuestos___________________________________________________ 4

4 Unificacin__________________________________________________________ 4
5 Listas_______________________________________________________________ 6
5.1
5.2
5.3
5.4
5.5
5.6
5.7
5.8
5.9

Definicin _________________________________________________________ 6
Recorrerunalista ____________________________________________________ 6
Recorrerunalistatomando elementosdedosendos___________________________ 7
Bsquedadeelementosenunalista _______________________________________ 7
Generacindeunalistamedianteconcatenacindeotrasdos ____________________ 8
Descomposicindeunalistaenpartes_____________________________________ 8
Generacindeunalistafiltrandoelementosdeotralista ________________________ 9
Aplicacindeunpredicadoatodosloselementos ____________________________ 9
Permutacionesdeunalista _____________________________________________ 9

6 Aritmtica ___________________________________________________________ 9
7 AritmticaconListas _________________________________________________ 11
7.1
7.2
7.3
7.4
7.5
7.6
7.7
7.8

Obtenerunvalorapartirdeunalista_____________________________________11
AcumulacindeResultados ___________________________________________11
Combinacinmiembroamiembrodeloselementosdedoslistas ________________11
Generacindeunalistaapartirdeunvalor ________________________________11
Generacindelistasporfiltradodeelementos ______________________________12
Clasificacindelistas________________________________________________12
Creacindeotraestructuraapartirdeunalista______________________________13
OtrasEstructurasRecursivas___________________________________________13

8 PredicadosInternos __________________________________________________ 14
8.1
8.2
8.3
8.4

Conversindetipos _________________________________________________14
Chequeodetipos ___________________________________________________14
Inspeccindeestructuras _____________________________________________15
Predicadosmetalgicos______________________________________________16

8.4.1 Chequeodetipo ___________________________________________________________16


8.4.2 Comparacindetrminosnobsicos___________________________________________16
8.4.3 ConversindeDatosenObjetivos_____________________________________________17

8.5

Corte ____________________________________________________________18

8.5.1 AplicacionesdelCorte ______________________________________________________18

8.6

PredicadosExtralgicos _____________________________________________21

8.6.1 Entrada/Salida____________________________________________________________21
8.6.2 AccesoalaBasedeDatos___________________________________________________23

8.7

PredicadosdeSegundoOrden__________________________________________24

9 EjerciciosPropuestos_________________________________________________ 25
10 BibliografaComentada _______________________________________________ 28
11 Indice ______________________________________________________________ 30

ProgramacinPrcticaenProlog

Chequeodetipo

1 Introduccin
Con estos apuntes se muestran las diferentes caractersticas del ncleo del lenguaje Prolog mediante sencillos
ejemplos.Seharealizadountratamientoespecialalaslistasyalosdiversosesquemasrecursivosparatrabajarcon
listas.Elobjetivo es ayudar al lector a identificaresquemas de programacin que puedanservirle para resolver
problemassimilares.Nosehapretendidorealizarunaguadetalladasinounapresentacinprcticainformaldel
lenguaje.Ellectorqueestinteresadoenprofundizarenellenguaje,deberconsultarloslibrosdelabibliografa.
Conelfindefacilitarlalectura,seutilizanlossiguientessmbolos:
Clave: 4
Puntoimportantearecordar
.
Posiblesejercicios
&
Comentariosavanzados
(
Notassobreportabilidad
Enlapresentacindeejemplosseutilizaunatablaescribiendoelcdigoylaspreguntasenlaparteizquierdaylos
comentariosenlapartederecha.

2 Hechos
/*RelacionProgenitor*/
progenitor(pilar,belen).
progenitor(tomas,belen).
progenitor(tomas,lucia).
progenitor(belen,ana).
progenitor(belen,pedro).
progenitor(pedro,jose).
progenitor(pedro,maria).

Se describen una serie de hechos conocidos sobre una


familia.
4 Sintaxis de Pr olog: Constantes y predicados
empiezan por minscula. Los hechos acaban en punto.
Variablescomienzanpormayscula.

Elprogramaanteriordebesercargadoenelsistema.Unavezcargado,esposiblerealizarpreguntas:
|?progenitor(pilar,belen).
Yes

Elsistemapueder esponder :
1.Yes: Sepuedededuciryelobjetivonotienevariables.

|?progenitor(pilar,lucia).
No

2.No: Nopuedededucirapartirdelprograma
La respuesta No indica que no se puede deducir. En la
vidareal,podraocurrirque pilar fuese madrede luca
(parecelomslgico)peroelsistemasuponequetodolo
quenoestdeclaradoesfalso1

3. Substitucin de Respuesta: Se puede deducir y el


|?progenitor(belen,X).
X=ana
X=pedro

objetivo tiene variables. Se indica el valorque tomanlas


variablesenlaresolucindelobjetivo.
En caso de que haya ms de una solucin. Cuando el
sistema obtiene una solucin espera a que el usuario
introduzca < > para solicitar ms soluciones o <Enter>
parafinalizar.Labsquedadeotrassolucionesserealiza
mediantebacktracking

3 Reglas
3.1 Reglas simples
/*Reglas*/
cuida(belen,pedro):paro(belen),
bueno(pedro).
/*2hechosms*/
paro(belen).
bueno(pedro).

Lareglaequivalea: BelncuidaaPedrosibelnesten
paroyPedroesbueno.Enlgicadepredicadossera:

paro(belen) bueno(pedro) cuida(belen,pedro)


Elsmbolo: podrainterpretarsecomo: (si)

Presuncindemundocerrado(CWAclosedworldassumption)
3

ProgramacinPrcticaenProlog

Chequeodetipo

3.2 ReglasconVariables
madre(X,Y):mujer(X),
progenitor(X,Y).

Equivalea:

mujer(pilar).mujer(belen).
mujer(lucia).mujer(ana).
mujer(maria).
hombre(tomas).hombre(pedro).
hombre(jose).

4Enlgicadepredicados:

|?madre(belen,pedro).
yes
|?madre(X,belen).
X=pilar
no
|?madre(belen,X).
X=ana
X=pedro
no

ParatodoXeY,siXesmujer yXes elprogenitor de Y,


entonceXeslamadre deY

x y(mujer(x) progenitor(x,y) madre(x,y))

La programacin lgica basa su modelo en la


utilizacin de relaciones, lo cual permite que un
mismo procedimiento sirva para diferentes
propsitos dependiendo de qu variables estn
instanciadas2
Enelejemplo,unamismareglamadre sirvepara:
Comprobarsibelenesmadre de pedro.
Calcularlamadre debeln
Calcularloshijosdebeln
Calcularparejasdemadres/hijos

|?madre(X,Y).
X=pilar,
Y=belen

4 Obsrvese que las variables de los objetivos


correspondenacuantificadoresexistenciales,esdecir:

X=belen,
Y=ana

?madre(belen,X)equivalea: ? x(madre(belen,x))

X=belen,
Y=pedro

Tngase en cuenta que a la hora de resolver la pregunta


madre(belen,X) con la cabezade la regla madre(X,Y) es
necesariorenombrarlavariableX

no

El lenguaje Prolog realiza internamente un proceso de


unificacinquesedescribeenlapgina4.

3.3 Reglas Recursivas

antepasado(X,Y):progenitor(X,Y).
antepasado(X,Y):progenitor(X,Z),
antepasado(Z,Y).

|?antepasado(belen,X).
X=ana
X=pedro
X=jose
X=maria
no
|?antepasado(X,belen).
X=pilar
X=tomas
no

Engeneral,enuna definicin recursiva, es necesario


considerar2casos:
Caso bsico: Momento en que se detiene la
computacin
Caso Recur sivo: Suponiendo que ya se ha
solucionado un caso mssimple, cmo descomponer
elcasoactualhastallegaralcasosimple.
4 Tanto el caso bsico como el caso recursivo no
tienen porqu ser nicos (puede haber varios casos
bsicosyvarioscasosrecursivos)
Las definiciones recursivas se resuelven de la misma
formaquelasreglascomunes.Enlatrazadeestetipo
de definiciones tiene especial importancia el
renombramientodevariables.
& Considerando la relacin progenitor como un
enlace entre dos nodos de un grafo. La relacin
antepasado indicara si hay camino entre dos nodos
del grafo dirigido acclico formado por la relacin
progenitor. Este tipo de relaciones se utiliza en
diversoscontextoscomolabsquedadecaminosentre
ciudades, la simulacin de movimientos de un
autmata,etc.
. Describir en Prolog una serie de caminos entre
diversasciudadesyconstruirunpredicadoqueindique

Sedicequeunavariableestinstanciadasitieneunvalorconcreto(enrealidadyanoseraunavariable)
4

ProgramacinPrcticaenProlog

Chequeodetipo

si2ciudadesestnconectadas.

3.4 Utilizacindefunciones
Seutilizalafuncin:cabeza(x)= cabezadex
Elprogramaindica:

grande(pepe).
grande(cabeza(juan)).
grande(X):mayor(X,Y).
mayor(cabeza(X),cabeza(Y)):progenitor(X,Y).

Pepeesgrande,lacabezadejuanesgrande,siXes
mayor que Y, entonces X es grande, adems: La
cabeza de X es mayor que la de Y si X es el
progenitordeY
4Prolognonecesitadeclaracionesdetipos.

|?grande(X).
X=pepe

4 LasvariablesenProlognotienentipo,deahque
la respuesta X puede ser una persona (pepe) o una
cabeza (cabeza(juan))

X=cabeza(juan)
X=cabeza(pilar)
X=cabeza(tomas)
...

3.5 DatosCompuestos
punto(X,Y)representaunpuntodecoordenadas(x,y)
seg(p1,p2)representaunsegmentocuyosextremos

horizontal(seg(punto(X,Y),
punto(X1,Y))).

sonlospuntosp1yp2

vertical(seg(punto(X,Y),
punto(X,Y1))).

Losargumentosdeunafuncinpuedenserfunciones

|?horizontal(seg(punto(1,2),punto(3,2))).
Yes

P=punto(_47796,2) indicaquePesunpunto

|?horizontal(seg(punto(1,2),P)).
P=punto(_47796,2)

cuya primera coordenada es una variable sin


instanciar3 ycuyasegundacoordenadaes2
La ltima respuesta indica que para que un

|?horizontal(P),vertical(P).
P=seg(punto(_29128,_29130),punto(_29128,_29130) segmentoseaverticaly horizontal a la vez, sus
coordenadasdebenserlasmismas(losnmeros
)

delasvariablesXeYcoinciden)

4 Unificacin
Durantelaresolucindeobjetivos,elsistemaPrologdeberealizarlaunificacinentrelosobjetivosylascabezas
delasreglasoloshechos.Deformasimplificada,elalgoritmodeunificacinconsisteen:
1.Inicializar s =substitucinvaca
2.Sialaplicar s alas2expresiones,stassoniguales,finalizarydevolver s
3.Buscardeizquierdaaderechalasprimerassubexpresionesdiferentes:
Sidichassubexpresionesestnformadasporunavariablevyuntrmino t (talquev t ) 4
Actualizar s conelresultadodesubstituir vport
Volvera2
EncasocontrarioFinalizarindicandoquelasexpresionesnounifican
|?f(X,X)=f(a,Y).
Eloperador=secumplesisusargumentosunifican.
X=a
El operador \= se cumple si sus argumentos no
Y=a
unifican.
|?f(X,X)\=f(a,Y).
no
|?p(f(X),g(Z,X))=p(Y,g(Y,a)).
X=a,
Z=f(a)
3

Puesto que Prolog no tiene chequeo de ocurrencias ,


seproduceunerror.

El formato de las variables sin instanciar vara de un sistema Prolog a otro. En estos apuntes, se utiliza un
nmerode4dgitosaleatorioprecedidodelcarcter_
4
Lacondicin v t seconocecomochequeodeocurrencias(occurcheck )ynoesimplementadaporlamayora
delossistemas Prolog debidoasucomplejidad.Estohacequeendeterminadasocasiones,elsistemasemetaen
unbucleinfinitotratandodeunificar2trminos
5

ProgramacinPrcticaenProlog

Chequeodetipo

4 Se produce error porque Prolog no implementa


chequeodeocurrencias yelalgoritmodeunificacin
entra en un bucle infinito. En la pgina 17 se
implementaelalgoritmodeunificacinconchequeo
deocurrencias.

Y=f(a)
|?p(X,X)=p(Y,f(Y)).
Error...,SystemStackFull

5 Listas
5.1 Definicin
LaslistassonunadelasestructurasdedatosmsutilizadasenlosprogramasenlenguajePrologyrespondenala
siguientedefinicin:
[]esunalista
[]denotalalistavaca
Si Xsesunalistaentonces [X|Xs]esunalista
[X|Xs] denotaunalistadecabezaXycola Xs
|?[1,2,3]=[1|[2|[3|[]]]].
yes

Elsistemaconvierteinternamenteentre:
[X,Y,Z]y [X|[Y|[Z|[]]]]
[X,Y|Z] y [X|[Y|Z]]

|?[X|Xs]=[1,2,3].
X=1,
Xs=[2,3]
|?[X|Xs]=[1].
X=1,
Xs=[]
|?[X,Y|Ys]=[1,2,3].
X=1,
Y=2,
Ys=[3]

4 Se utiliza una sintaxis especial para las listas de


caracteres del tipo abc que se convierten
internamente en listas de los cdigos ASCII
correspondientes.

|?X="abc".
X=[97,98,99]

lista([]).
lista([X|Xs]):lista(Xs).

Puesto que las listas son una estructura de datos definida de


formarecursiva. Lamayoradelasdefinicionesidentificarnel
casobsicoconlalista vacayelcasorecursivocon[X|Xs]

|?lista([1,2]).
yes

Notodaslasdefinicionesrecursivasconlistasutilizanesosdos
casos

|?lista(X).
X=[]
X=[_2440]

Comoconvenio,losnombresdevariablesensingular(X,Y,...)
indican elementos, mientras que en plural indican listas
(Xs,Ys,...).LaslistasdelistassesuelenrepresentarcomoXss

X=[_2440,_4572]
X=[_2440,_4572,_6708]

4La llamada lista(X) genera por backtracking listas de


cualquiertipodeelementos.

X=[_2440,_4572,_6708,_8848]
...

5.2 Recorrerunalista
hombres([]).
hombres([X|Xs]):hombre(X),
hombres(Xs).
noPertenece(X,[]).
noPertenece(X,[Y|Ys]):X\=Y,
noPertenece(X,Ys).
|?hombres([jose,tomas,pedro]).
yes
|?hombres([jose,pilar,tomas]).

hombres(Xs) : Todos los X de Xs cumplen


hombre(X)
noPertenece(X,Xs) :Elelemento Xnopertenece
alalistaXs (se comprueba que no unifica con
ningnelementode Xs
Enlasdefinicionesrecursivas,convieneescribir
elcasobsicoantesqueelcasorecursivoyaque
si la definicin unifica con ambos casos y
6

ProgramacinPrcticaenProlog

Chequeodetipo

no
|?noPertenece(pilar,[jose,pilar,tomas]).
no

estuviese pusiese el caso recursivo antes, el


sistemaentraraenunbucleinfinito.
De la misma forma, es conveniente que la
llamada recursiva sea la ltima llamada de la
definicin recursiva (muchos sistemas
optimizanlasdefinicionesasescritas)

|?noPertenece(luis,[jose,pilar,tomas]).
yes

5.3 Recorrerunalistatomandoelementosdedosendos
todosIguales([]).
todosIguales([X]).
todosIguales([X,X|Xs]):todosIguales([X|Xs]).

todosIguales(Xs): Los elementos de Xs son

|?todosIguales([1,2,3]).
no

Obsrvese que hay dos casos bsicos y que el


casorecursivonoesdelaforma[X|Xs].

|?todosIguales([1,1,1]).
yes

todosiguales

X=[_27704,_27704]

Obsrvesequelostrescasosseexcluyen.Como
regla general, conviene que los casos de una
definicinseexcluyan.Cuandoloscasosnose
excluyen, al realizar backtracking el sistema
puede obtener respuestas distintas de las
esperadas.

X=[_27704,_27704,_27704]

.Describirlarespuestaante:

|?todosIguales(X).
X=[]
X=[_25576]

?todosIguales([2,X,Y]).
X=[_27704,_27704,_27704,_27704]

5.4 Bsquedadeelementosenunalista
pertenece(X,[X|Xs]).
pertenece(X,[Y|Ys]):pertenece(X,Ys).

pertenece(X,Xs) :Xestenlalista Xs
Elcasobsiconoeslalistavaca.Adems,loscasos

|?pertenece(pedro,[jose,pedro,tomas]). no se excluyen. Una lista que encaje con la primera


yes
definicin,loharconlasegunda.
|?pertenece(jose,[]).
no
|?pertenece(X,[jose,pedro,tomas]).
X=jose

La relacin pertenece es un claro ejemplo de la


flexibilidad de las definiciones en Prolog ya que se
puedeutilizarpara:

X=pedro

1.Chequearsiunelementopertenece aunalista

X=tomas

2. Obtener todos los elementos de una lista por


backtracking

no
|?pertenece(jose,X).
X=[jose|_6617]

3. Obtener listas con un elemento X en primera,


segunda,...nsimaposicin.

X=[_8808,jose|_8817]
X=[_8808,_11012,jose|_11021]
X=[_8808,_11012,_13230,jose|_13239]
...
elimina(X,[X|Xs],Xs).
elimina(X,[Y|Ys],[Y|Zs]):elimina(X,Ys,Zs).
|?elimina(1,[1,2,1,3],V).
V=[2,1,3]
V=[1,2,3]
no
|?elimina(1,V,[2,3]).

eliminna(X,Ys,Zs):Zs contiene todas las


listas resultantes de eliminar el elemento X
deYs
4El predicado selecciona sirve tambin
paradiversospropsitos:
Borrarelementosdeunalista
Insertar un elemento en diferentes
posicionesdeunalista
7

ProgramacinPrcticaenProlog

Chequeodetipo

. Describir el comportamiento del


predicado si se aade X\=Y en la segunda
definicin.

V=[1,2,3]
V=[2,1,3]
V=[2,3,1]
no

algunHombre(Xs):pertenece(X,Xs),
hombre(X).

algunHombre(Xs):algunodeloselementosXdeXs
cumplelarelacin hombre(X)

|?algunHombre([jose,pilar,tomas]).
yes

5.5 Generacin deunalistamedianteconcatenacindeotrasdos


concat([],Ys,Ys).
concat([X|Xs],Ys,[X|Zs]):concat(Xs,Ys,Zs).

concat(Xs,Ys,Zs):Zs es el resultado de
concatenarlaslistas Xs eYs

|?concat([1,2],[3,4],V).
V=[1,2,3,4]
4 Obsrvese

la flexibilidad de la
definicin de concat que permite una
gran variedad de usos dependiendo de
qu variables estn instanciadas en la
llamada.

|?concat([1,2],X,[1,2,3,4]).
X=[3,4]
|?concat(X,Y,[1,2,3,4]).
X=[],
Y=[1,2,3,4]
X=[1],
Y=[2,3,4]
X=[1,2],
Y=[3,4]
X=[1,2,3],
Y=[4]
X=[1,2,3,4],
Y=[]
no

5.6 Descomposicindeunalistaenpartes
Gracias a la flexibilidad de las relaciones lgicas, el predicado concat se utiliza en la definicin de una gran
cantidaddepredicados.
prefijo(Xs,Ys):concat(Xs,Bs,Ys).
sufijo(Xs,Ys):concat(As,Xs,Ys).
sublista(Xs,Ys):concat(AsXs,Bs,Ys),
concat(As,Xs,AsXs).
|?prefijo([1,2],[1,2,3,4]).
yes
|?sufijo([3,4],[1,2,3,4]).
yes
|?pertenece1(1,[2,1,3]).
yes

Definir los predicados prefijo, sufijo y sublista de


formarecursivasinlaayudadelpredicado concat
Definirmedianteconcatlospredicados:
pertenece(X,Xs):X esunelementode Xs
reverse (Xs,Ys):Ys es Xs con los elementos en
ordeninverso
adyacentes(X,Y,Xs) :X e Y estn en posiciones
consecutivasen Xs
ultimo(Xs,X) :XeselltimoelementodeXs
primeros(Xs,Ys) :Ys es el resultado de eliminar el
ltimoelementoa Xs

|?sublista([2,3],[1,2,3,4]).
yes

ProgramacinPrcticaenProlog

Chequeodetipo

5.7 Generacin deunalistafiltrandoelementosdeotralista


filtraHombres([],[]).
filtraHombres([X|Xs],[X|Ys]):hombre(X),
filtraHombres(Xs,Ys).
filtraHombres([X|Xs],Ys):mujer(X),
filtraHombres(Xs,Ys).

|?filtraHombres([jose,pilar,tomas],V).
V=[jose,tomas]

filtraHombres(Xs,Ys): Yscontienetodos
loshombresdelalista Xs.
. Obsrvese qu ocurre cuando se
solicitan
ms
soluciones
por
backtracking ocuandosepregunta:
?filtraHombres(V,[jose,pilar]).

sinDuplicados(Xs,Ys) :Ys contiene los

sinDuplicados([],[]).
elementosde Xs eliminando elementos
sinDuplicados([X|Xs],[X|Ys]):noPertenece(X,Xs),
duplicados.
sinDuplicados(Xs,Ys).
sinDuplicados([X|Xs],Ys):pertenece(X,Xs),
sinDuplicados(Xs,Ys). 4Ambas
definiciones son poco

eficientes
|?sinDuplicados([1,1,2,3,2,1,4],V).
V=[3,2,1,4]

.Construirelpredicado sinDuplicados
para que la lista resultado contenga los
elementos en el mismo orden en que
aparecen

5.8 Aplicacindeunpredicadoatodosloselementos
edad(pilar,85).edad(tomas,90).
edad(belen,67).edad(lucia,64).
edad(ana,34).edad(pedro,36).
edad(jose,10).

edades(Xs,Ys): Ys contiene las edades


deloselementosde Ys

edades([],[]).
edades([X|Xs],[Y|Ys]):edad(X,Y),edades(Xs,Ys).
|?edades([jose,pilar,tomas],V).
V=[10,85,90]

4Si alguno de los elementos no tiene


edad,elpredicadofalla.

|?edades([jose,dedo,tomas],V).
no
|?edades(V,[10,85]).
V=[jose,pilar]

5.9 Permutacionesdeunalista
permutacion([],[]).
permutacion(Xs,[X|Ys]):elimina(X,Xs,Zs),
permutacion(Zs,Ys).

permutacion(Xs,Ys):

Ys
permutacindelalista Xs

es

una

|?permutacion([1,2,3],V).
V=[1,2,3]
V=[1,3,2]
V=[2,1,3]
V=[2,3,1]
V=[3,1,2]
V=[3,2,1]
no

6 Aritmtica
Conel fin de aprovecharlasposibilidadesaritmticas de loscomputadoresconvencionales,ellenguaje Prolog
contieneunaseriedepredicadosdeevaluacinaritmtica.
Alencontrarunobjetivodelaforma ?XisE elsistema:
Evalalaexpresin Ehastaobtenerunvaloraritmtico v(sinopuede,devuelveunerror)
Elobjetivosecumplesi X unificacon v

ProgramacinPrcticaenProlog

Chequeodetipo

LaexpresinE puede contener los operadores aritmticos clsicos (+, , *, mod, etc.) y valores numricos. Si
contienevariables,stasdebenestarinstanciadasaunvalornumricoenelmomentodelaevaluacin.
|?Xis3+5.
X=8
|?Xispepe.
Erroralevaluar
|?8is3+5.
yes
|?4is3+5.
no

La evaluacin de 3+5 se realiza internamente en


unainstruccindelprocesador.
Silaexpresinnoresultaenunvaloraritmtico,se
obtieneunerror.

Alevaluarpuedenproducirseerrores.

|?Xis4/0.
Erroraritmtico
|?XisX+1.
Erroralevaluar
|?X=3,YisX+5.
X=3,
Y=8
|?X=0,XisX+1.
no
|?X=3+5.
X=3+5

El operador is no es nunca un operador de


asignacincomoel := de Pascal. En general, una
expresin del tipo X is X+1 no tiene sentido en
Prolog.
Describir en qu situaciones X is X + 1 es un
erroryenqusituacionesfallasinms.
4 El operador = unifica sus argumentos pero no
evala.

par(X):0isXmod2.
impar(X):1isXmod2.
suma(X,Y,Z):ZisX+Y.
|?par(3).
no
|?par(4).
yes
|?suma(2,3,V).
V=5

Coneloperador is se pierde la flexibilidad de las


relaciones lgicas. Lo ideal es que al evaluar
suma(2,V,5) ,elsistemadevolviese V=3
.

Por qu se obtiene error al evaluar


suma(2,V,5) ynoseobtieneerroralevaluar par(4)?

|?suma(2,V,5).
Erroralevaluar

Ademsdelpredicado is,lospredicadosdecomparacinrealizanunaevaluacinaritmticadesusargumentosy
secumplensilosvaloresobtenidoscumplenlasrelacionescorrespondientes:
|?3+5>2+6.
no
|?3+5>=2+6.
yes
|?3+5<2+6.
yes

&Paralacomparacinseutilizaeloperador=<
en lugar del ms habitual <= debido a que ste
ltimo se asemeja a una doble flecha y se reserva
paraotrospropsitos
. Describir la diferencia entre el comportamiento
delosoperadores:=,is y=:=

|?3+5=<2+6.
yes
|?3+5=:=2+6.
yes
|?3+5=\=2+6.
no
fact(0,1).
fact(N,F):N>0,
N1isN1,
fact(N1,F1),
FisN*F1.

fact(N,F):F eselfactorialde N
4 La versin de factorialaqu presentadaes poco
eficiente.
10

ProgramacinPrcticaenProlog

Chequeodetipo

|?fact(5,V).
V=120

7 AritmticaconListas
7.1 Obtenerunvalorapartirdeunalista
sum([],0).
sum([X|Xs],S):sum(Xs,Sc),SisSc+X.
long([],0).
long([X|Xs],L):long(Xs,Lc),LisLc+1.
prod([],1).
prod([X|Xs],P):prod(Xs,Pc),PisPc*X.
|?sum([1,2,3,4],V).
V=10
|?long([1,2,3,4],V).
V=4
|?prod([1,2,3,4],V).
V=24
%%Versionoptimizadadesum
sum1(Xs,S):sumAux(Xs,0,S).
sumAux([],S,S).
sumAux([X|Xs],Sa,S):SnisX+Sa,
sumAux(Xs,Sn,S).

& Obsrvese la similitud entre las tres


definiciones. En algunos lenguajes se utilizan
construcciones de orden superior que permiten
utilizar una nica definicin parametrizada por las
operacionesyconstantes5.
4Las definiciones ofrecidas no aprovechan la
optimizacin de la recursividad de cola . Consiste
en que el ltimo objetivo de una definicin
recursiva sea el predicado que se est definiendo.
Lossistemascondicha optimizacinpermitenque
las definiciones recursivas se comporten de forma
similaraunbucleenunlenguajeimperativo.
sum1 esunaversinoptimizadade sum
4 La definicin de sum1 sigue el patrn de
acumulacinderesultados queseveacontinuacin

7.2 AcumulacindeResultados
Adiferenciadeloslenguajesimperativos, Prolog utiliza variables lgicas. En el momento en que una variable
lgicaesinstanciada,dichovalornopuedemodificarse.Deestaforma,noesposibleutilizarvariablesglobales
cuyovalorsemodifiquedurantelaresolucindelobjetivo.Existenciertosalgoritmosquerequierenlautilizacin
deun estadoquealmacenaresultados intermedios. Para implementardichos algoritmoses necesario utilizarun
predicadoauxiliarconunargumentoextraquealmacenarelestadoquesemodifica.
Ladefinicinde sum1delaseccinanteriorsigueelpatrnmencionado.
sumAcum(Xs,Ys):sumAc(Xs,0,Ys).
sumAc([],S,[]).
sumAc([X|Xs],Sa,[Sp|Ys]):SpisX+Sa,
sumAc(Xs,Sp,Ys).
|?sumAcum([1,2,3,4],V).
V=[1,3,6,10]

xi paracada yj Ys

sumAcum(Xs,Ys): yj =

= 1

. Construir la definicin del predicado


maximo(Xs,M) que se cumple si M es el
mximodeloselementosdeXs

7.3 Combinacinmiembroamiembrodeloselementosdedoslistas
prodEscalar(Xs,Ys,P):pEsc(Xs,Ys,0,P).
pEsc([],[],P,P).
pEsc([X|Xs],[Y|Ys],Pa,Pr):PnisPa+X*Y,
pEsc(Xs,Ys,Pn,Pr).
|?prodEscalar([1,2,3],[4,5,6],P).
P=32

prodEscalar(Xs,Ys,P) :P es el producto

escalardelosvectoresXseYs(P= Sxi y i )
4En esta definicin se utiliza adems el
patrn de acumulacin de resultados
anterior.

7.4 Generacin deunalistaapartirdeunvalor


Esposiblegenerarunalista mediante la descomposicinde un valor. Enelprimerejemplo, sedescompone un
nmeronaturalhastallegaracero,enelsegundo,sedescomponeunintervalohastaquelosextremossoniguales.
5

Enestesentido,loslenguajesfuncionalessecaracterizanporutilizarfunciones deordensuperior, permitiendo


unamayor reutilizacindecdigo.
11

ProgramacinPrcticaenProlog

repite(0,X,[]).
repite(N,X,[X|Xs]):N>0,
N1isN1,
repite(N1,X,Xs).
intervalo(X,X,[X]).
intervalo(X,Y,[X|Xs]):X<Y,
ZisX+1,
intervalo(Z,Y,Xs).

Chequeodetipo

repite(N,X,Xs):Xscon NelementosdevalorX

intervalo(X,Y,Xs) :Xs es una lista creciente cuyo


primervalores Xysultimovalor Y

|?repite(3,a,V).
V=[a,a,a]
|?intervalo(1,5,V).
V=[1,2,3,4,5]

7.5 Generacindelistasporfiltradodeelementos
Lossiguientesejemplosmuestrancmosepuedegenerarunaovariaslistasfiltrandoloselementosdeotraslistas.
En pares,lacondicindefiltrado(serpar)indicasiseinserta onoelelemento
En inserta lacondicindefiltrado(sermenoromayor queelvalorX)indicasiseseleccionaelelementoYde
lalista queserecorreoelelemento X ainsertar
En particionlacondicindefiltradoindicaenqulista seinserta
Enelltimocaso,serecorrendoslistasylacondicinindicadeculdelaslistasseleccionarelvalor
pares([],[]).
pares([X|Xs],[X|Ys]):par(X),pares(Xs,Ys).
pares([X|Xs],Ys):impar(X),pares(Xs,Ys).

pares(Xs,Ys):Ys

contiene
los
elementosparesde Xs. Se filtran los
elementospares

|?intervalo(1,5,V),pares(V,P).
V=[1,2,3,4,5],
P=[2,4]

inserta(X,[],[X]).
inserta(X,[Y|Ys],[X,Y|Ys]):X<Y.
inserta(X,[Y|Ys],[Y|Zs]):X>=Y,
inserta(X,Ys,Zs).

inserta(X,Xs,Ys):Ys es el resultado
deinsertar Xenlaposicinadecuada
delalistaordenadaXs de forma que
Ys semantengaordenada.

|?inserta(3,[1,2,4],V).
V=[1,2,3,4]
particion(X,[Y|Ys],[Y|Ps],Gs):Y<X,
particion(X,Ys,Ps,Gs).
particion(X,Xs,Ps,Gs): Ps contiene
particion(X,[Y|Ys],Ps,[Y|Gs]):Y>=X,
particion(X,Ys,Ps,Gs). los elementos de Xs ms pequeos
particion(X,[],[],[]).
queXyGsloselementosdeXsms

grandesoigualesqueX.

|?particion(3,[2,4,1,5],X,Y).
X=[2,1],
Y=[4,5]
mezcla(Xs,[],Xs).
mezcla([],[Y|Ys],[Y|Ys]).
mezcla([X|Xs],[Y|Ys],[X|Zs]):X<Y,
mezcla(Xs,[Y|Ys],Zs).
mezcla([X|Xs],[Y|Ys],[Y|Zs]):X>=Y,
mezcla([X|Xs],Ys,Zs).
|?mezcla([1,3,5],[2,4,6],V).
V=[1,2,3,4,5,6]

mezcla(Xs,Ys,Zs) :Zs es una lista


ordenadaformadaapartirdelaslistas
ordenadas Xs e Ys
4Obsrvese que esta definicin
consta de dos casos bsicos y dos
recursivos.
El segundo caso bsico podra haber
sido: mezcla([],Ys,Ys) pero no
sera excluyente con el primero
cuandoXs e Ys estnvacas.

7.6 Clasificacindelistas
ordenada([]).
ordenada([X]).

ordenada(Xs): Los elementos de Xs estn en


12

ProgramacinPrcticaenProlog

ordenada([X,Y|Ys]):X<Y,ordenada([Y|Ys]).
ordenaBruto(Xs,Ys):permutacion(Xs,Ys),
ordenada(Ys).

Chequeodetipo

ordenascendente
.qupatrnsigueladefinicinde ordenada ?

ordenaBruto(Xs,Ys) :Ys contiene los elementos


de Xs en orden ascendente (utiliza el famoso
algoritmodelafuerzabruta )
ordenaIns([],[]).
ordenaIns([X|Xs],Ys):ordenaIns(Xs,XsO),
inserta(X,XsO,Ys).

ordenaIns(Xs,Ys): Ys contiene los elementos de


Xs en orden ascendente (utiliza el algoritmo de
insercin)

quicksort([],[]).
quicksort(Xs,Ys):Ys contieneloselementosdeXs
quicksort([X|Xs],Ys):particion(X,Xs,Ps,Gs),
enordenascendente(algoritmo quicksort6)
quicksort(Ps,PsO),
quicksort(Gs,GsO),
concat(PsO,[X|GsO],Ys). . Escribir la definicin del algoritmo de
|?quicksort([3,1,2,4],V).
V=[1,2,3,4]

clasificacin mergesort (de forma similar a


quicksort,dividelalista en dos mitades de igual
tamao,lasclasificaylasmezcla).

7.7 Creacindeotraestructuraapartirdeunalista
Enmuchasocasionespuedesernecesarioconvertirunalista enotraestructura.
Supngasequesedeseacomprimirunalistaconmuchosvaloresrepetidosenunaestructuraqueinformedeltipo
devalorydelnmerodevecesqueaparece7.Paraello,seutilizauntrminoestructuradodelaformacod(X,N)
indicandoqueeltrmino X aparece Nveces.
comprime([],[]).
comprime([X|Xs],Ys):comp(Xs,X,1,Ys).
comp([],C,N,[cod(C,N)]).
comp([X|Xs],X,N,Ys):N1isN+1,
comp(Xs,X,N1,Ys).
comp([X|Xs],Y,N,[cod(Y,N)|Ys]):
X\=Y,
comp(Xs,X,1,Ys).

comprime(Xs,Ys):Ys es una lista cuyos


elementostienenlaforma cod(X,N)donde X
indicaunelementode Xs yN indicaelnmero
devecesqueserepite.
. Construir un predicado que calcule la
frecuenciadecadaelementodeunalista

|?comprime([a,a,b,b,b,c,b,b],V).
V=[cod(a,2),cod(b,3),cod(c,1),cod(b,2)]

7.8 OtrasEstructurasRecursivas
Lasestructurasrecursivasformanunapartefundamentaldeloslenguajesdeprogramacin8.
Acontinuacinsedefinenunospredicadosdeconversinentreunalista yrbol binariodebsqueda.
Losrbolesbinariossedefinenporinduccindelasiguienteforma:
vacio ArbolesBinarios
SiA1 yA2 ArbolesBinariosentoncesrama(X,A1,A2) ArbolesBinarios
Ejemplo: rama(2,rama(1,vacio,vacio),vacio).
Losrbolesdebsquedasecaracterizanporqueelvalordecualquiernododelrbolesmayor queelvalordelos
nodosasuizquierdaymenosqueelvalordelosnodosasuderecha.
insertArbol(X,vacio,rama(X,vacio,vacio)).

insertArbol(X,A,An):An es el rbol de

Elalgoritmo quicksortsecaracterizaporque,aunqueenelcasopeortienecomplejidadO(n2),enelcasomedio
tienecomplejidadO(nlog2 n)
7
Esteesquemadecodificacinseconocecomo runlengthencodedyesmuyutilizadoparacomprimirimgenes
8
Laslistassonuncasoespecialdeestructurarecursiva
13

ProgramacinPrcticaenProlog

Chequeodetipo

insertArbol(X,rama(X,A1,A2),rama(X,A1,A2)).
insertArbol(X,rama(Y,A1,A2),rama(Y,A1n,A2)):
X<Y,insertArbol(X,A1,A1n).
insertArbol(X,rama(Y,A1,A2),rama(Y,A1,A2n)):
X>Y,insertArbol(X,A2,A2n).

bsquedaresultantedeinsertar X enA

listArbol(Xs,A):creaArbol(Xs,vacio,A).

.Indicarqupatrnderecursividadseutiliza
enladefinicinde listArbol

creaArbol([],A,A).
creaArbol([X|Xs],Ao,Ar):insertArbol(X,Ao,An),
creaArbol(Xs,An,Ar).

|?listArbol([2,1,3],V).
V=rama(2,rama(1,vacio,vacio),rama(3,vacio,vacio))
busca(X,rama(X,_,_)).
busca(X,rama(Y,A1,A2)):X<Y,busca(X,A1).
busca(X,rama(Y,A1,A2)):X>Y,busca(X,A2).
nodos(vacio,[]).
nodos(rama(X,A1,A2),Xs):nodos(A1,Xs1),
nodos(A2,Xs2),
concat(Xs1,[X|Xs2],Xs).
ordenArbol(Xs,XsO):listArbol(Xs,A),
nodos(A,XsO).

listaArbol(Xs,A): A es el rbol de bsqueda


creadoapartirdelalista Xs

busca(X,A):SecumplesiXestenelrbol A
nodos(A,Xs):Xs sonlosnodosdelrbol A.
&Elpredicadonodosrealizaelrecorridodel
rbol empezandoporlosnodosdelaizquierda,
luego el nodo central y finalmente los de la
derecha. Este recorrido se conoce como
recorrido inorden. Existen otros recorridos
como preordeny postorden
4Obsrvese que con los rboles podran
definirse patrones recursivos similares a los
definidosparalaslistas9.

|?ordenArbol([2,1,3,4],V).
V=[1,2,3,4]

8 PredicadosInternos
8.1 Conversindetipos
Engeneral, Prolognocontienechequeodetiposentiempodecompilacin,siendonecesarioutilizarunaseriede
predicadospredefinidosquechequeaneltipodesusargumentos.

Predicado
atom_chars(A,Cs)

number_chars(N,Cs)

number_atom(N,A)

Condicinparaquesecumpla PreguntasSimples
Cs eslalistadecaracteresque |?atom_chars(abc,V).
V=[97,98,99]
representaeltomo A
|?atom_chars(V,"abc").
V=abc
Cses lalistadecaracteresque |?number_chars(123,V).
V=[49,50,51]
representaelnmero N
|?number_chars(V,"123").
V=123
Aeseltomoquerepresentael |?number_atom(123,V).
V='123'
nmero N
|?number_atom(V,'123').
V=123

8.2 Chequeodetipos
Engeneral, Prolognocontienechequeodetiposentiempodecompilacin,siendonecesarioutilizarunaseriede
predicadospredefinidosquechequeaneltipodesusargumentos.

Predicado
integer( X)
9

Condicinparaquesecumpla Ejemplos
4
X esunentero.

Actualmente,seinvestigalaposibilidaddeutilizarlenguajesquedefinanautomticamentedichospatronesde
recursividadparalosdiferentestiposdedatosdefinidosporelusuario.
14

ProgramacinPrcticaenProlog

float(X)
number(X)
atom(X)
atomic(X)
compound(X)
list(X)

Chequeodetipo

X esunflotante.
X esunnmero.
X esuntomo.
X esuntomoounnmero.
X esuntrminocompuesto.
X esunalista.

sumaLogica(X,Y,Z):integer(X),
integer(Y),
ZisX+Y.
sumaLogica(X,Y,Z):integer(Y),
integer(Z),
XisZY.
sumaLogica(X,Y,Z):integer(X),
integer(Z),
YisZX.

4.5
44.5
pepe[]
pepe44,5[]
padre(luis,juan)[3]
[][3]3,2

sumaLogica(X,Y,Z):ZesigualaX+Y
Define unpredicado aritmtico que admitela
flexibilidad delasrelacioneslgicas.

|?sumaLogica(2,3,V).
V=5
|?sumaLogica(3,V,5).
V=2

alisar([],[]).
alisar([X|Xs],Ls):list(X),
alisar(X,Ls1),
alisar(Xs,Ls2),
concat(Ls1,Ls2,Ls).
alisar([X|Xs],[X|Ls]):atomic(X),
alisar(Xs,Ls).

alisar(Xs,Ys): Ys contiene una lista con los


elementosdelaslistasde Xs
4Obsrvese que se utiliza el patrn de
generacin de una lista por filtrado de
elementos.

|?alisar([[1,2],[3],[[4]]],V).
V=[1,2,3,4]

8.3 Inspeccindeestructuras
Predicado
Condicinparaquesecumpla Ejemplos
functor(T,F,A) Tes un trmino compuesto de |?functor(f(a,b),F,A).
functor F yaridad A
F=f,
A=2
|?functor(T,f,2).
T=f(_4648,_4650)

arg(N,T,A)

AeselargumentoNsimodel |?arg(2,f(a,b,c),A).
trmino T
A=b
|?arg(2,f(a,X,c),b).
X=b

T=..Ls

subTer(T,T).
subTer(S,T):compound(T),
T=..[F|Args],
subTerL(S,Args).

Ls es una lista cuyo primer |?f(a,b)=..Ls.


elemento es el functor de T y Ls=[f,a,b]
cuyorestodeelementossonlos
argumentosde T
|?T=..[f,a,b].
T=f(a,b)

subTer(S,T) : Se cumple si S es un
subtrminodeT
& El predicado =.. tambin se conoce
15

ProgramacinPrcticaenProlog

Chequeodetipo

subTerL(S,[A|As]):subTer(S,A).
subTerL(S,[A|As]):subTerL(S,As).

comouniv

|?subTer(g(b),f(a,g(b),c)).
yes
|?subTer(X,f(a,g(b))).
X=f(a,g(b))
X=g(b)

subTerm(S,T):Se cumple si S es un
subtrminodeT.

X=b
X=a
subTerm(T,T).
subTerm(S,T):compound(T),
functor(T,F,A),
subTermA(A,S,T).
subTermA(N,S,T):arg(N,T,Ta),
subTerm(S,Ta).
subTermA(N,S,T):N>1,
N1isN1,
subTermA(N1,S,T).

4Engeneralelpredicado=..proporciona
la misma expresividad que los predicados
functor y arg juntos. Sin embargo,
aunque los programas con =.. son ms
legibles,tambinsonmenoseficientes,pues
necesitanconstruirunalista auxiliar.

8.4 Predicadosmetalgicos
Lospredicadosmetalgicospermitencontrolarelalgoritmoderesolucinfacilitandola metaprogramacin.sta
consiste en construir programas que manipulan otros programas proporcionando una mayor expresividad al
lenguaje.

8.4.1 Chequeodetipo
Predicado
var(X)

Ejemplos
Condicinparaquesecumpla
X esunavariablenoinstanciada |?var (X).
X=_

|?X=1,var(X).
no

nonvar( X)

X no es una variable o es una


variableinstanciada

|?nonvar (X).
no
|?X=1,nonvar(X).
X=1

La utilizacin de estos predicados permite al programador chequear si una variable est instancia o no para
proporcionarprogramasmsflexiblesyeficientes.
abuelo(X,Y):nonvar(X),
hombre(X),progenitor(X,Z),progenitor(Z,Y).
abuelo(X,Y):nonvar(Y),
progenitor(Z,Y),progenitor(X,Z),hombre(X).

abuelo(X,Y) : X esabuelode Y

8.4.2 Comparacindetrminosnobsicos
Predicado
X==Y

Condicinparaquesecumpla Ejemplos
X eY son iguales (no unifica |?f(X,2)=f(1,Y).
lasvariables)

X=1,
Y=2

|?f(X,2)==f(1,Y).
no
X\==Y

X e Y no son iguales (no |?f(X,2)\==f(1,Y).


yes

16

ProgramacinPrcticaenProlog

ConversindeDatosenObjetivos

unificalasvariables)

unifica(X,Y):var(X),var(Y),X=Y.
unifica(X,Y):var(X),nonvar(Y),noOcurre(X,Y),X=Y.
unifica(X,Y):var(Y),nonvar(X),noOcurre(Y,X),Y=X.
unifica(X,Y):nonvar(X),nonvar(Y),atomic(X),atomic(Y),
X=Y.
unifica(X,Y):nonvar(X),nonvar(Y),compound(X),compound(Y),
unifTerm(X,Y).
unifTerm(X,Y):functor(X,F,A),
functor(Y,F,A),
unifArgs(A,X,Y).
unifArgs(N,X,Y):N>0,unifArg(N,X,Y),
N1isN1,unifArgs(N1,X,Y).
unifArgs(0,X,Y).
unifArg(N,X,Y):arg(N,X,Ax),arg(N,Y,Ay),unifica(Ax,Ay).

unifica(X,Y):SecumplesiXeYson
unificables utilizando chequeo de
ocurrencias.
|?unifica(f(1,X),f(Y,2)).
X=2,
Y=1
|?f(X,X)=f(Y,g(Y)).
Error...StackFull,
|?unifica(f(X,X),f(Y,g(Y))).
no

noOcurre(X,T): se cumple si la
variable XnoapareceeneltrminoT

noOcurre(X,Y):var(Y),X==Y.
noOcurre(X,Y):nonvar(Y),atomic(Y).
noOcurre(X,Y):nonvar(Y),compound(Y),
functor(Y,F,A),noOcurreArgs(A,X,Y).
noOcurreArgs(N,X,Y):N>0,arg(N,Y,An),noOcurre (X,An),
N1isN1,noOcurreArgs(N1,X,Y).
noOcurreArgs(0,X,Y).

8.4.3 ConversindeDatosenObjetivos
Elpredicado call(X)secumplesisecumpleelobjetivoX.
o(X,Y):call(X).
o(X,Y):call(Y).
|?o(progenitor(belen,tomas),progenitor(tomas,belen)).
yes
|?progenitor(belen,tomas)progenitor(tomas,belen).
yes

o(X,Y):secumplesisecumpleXosi
secumpleY
4 El predicado o(X,Y)
predefinidocomoeloperador

est

for(0,X).
for(N,X):call(X),N1isN1,for(N1,X).
|?for(5,write('*')).
*****
yes

4 El Prolog Standard sustituye


automticamenteunaobjetivoenforma
devariable Xporcall(X)

|?T=..[progenitor,tomas,belen],T.
T=progenitor(tomas,belen)

17

ProgramacinPrcticaenProlog

ConversindeDatosenObjetivos

8.5 Corte
Elcorteesunodelospredicadosinternosmspolmicosdellenguaje Prolog.Seutilizaparapodarramasdel
rbolderesolucin consiguiendo que el sistema vaya ms rpido. Un mal uso del corte puede podar ramas del
rbolderesolucinquecontengansolucionesimpidiendoqueelsistemaencuentrealgunassoluciones(otodas)a
unproblemadado.Deestaformaseaconsejautilizarelcorteconprecauciny nicamenteenellugar necesar io,
Niantesnidespus.
Elpredicadocorteserepresentamedianteelsmbolo!ysuefectoes:
Elpredicadosiempresecumple.
Siseintenta reejecutar (alhacerbacktracking) elimina las alternativas restantes de los objetivos que hay
desdesuposicinhastalacabezadelaregladondeaparece.
q(X):p(X).
q(0).

En la figura puede observarse que el corte afecta a las soluciones


alternativasdelpredicadop(X)ydelpredicadoa(X).
?q(X).

p(X):a(X),!,b(X).
p(1).

{X/0}
?p(X).

a(2).a(3).

p
X=0

{X/1}

b(2).b(2).b(3).
?a(X),!,b(X).

<Conelcorte>
|?q(X).
X=2

{X/2}
?!,b(2).

p
X=1

{X/3}
?!,b(3).

X=2
X=0
<Sinsequitaelcorte>
|?q(X).
X=2

?b(2).

p
X=2

p
X=2

?b(3).

p
X=3

X=2
X=3
X=1
X=0

padre(X,Y):progenitor(X,Y),hombre(X).
|?padre(X,belen).
X=tomas
no
|?
padre(X,Y):progenitor(X,Y),hombre(X),!.
|?padre(X,belen).
X=tomas
|?

orgulloso(X):padre(X,Y),recien_nacido(Y).

padre(X,Y):X eselpadrede Y.
Se encuentra el primer progenitor hombre de belen
(tomas) y el sistema busca ms progenitores mediante
backtracking.Comonolosencuentra,devuelve no .
En este ejemplo particular, suponiendo que cualquier
persona tiene un nico padre , podra ser interesante
podarlasalternativasqueseencuentren.
Seracomodeclarar:
X es padre de Y si es su progenitor, es hombre y
adems,esnico:
4Unbuenusodelcortepuedepermitirlaconstruccin
deprogramas Prologeficientes.
orgulloso(X):Xestorgulloso(cuandoespadre de un
recinnacido).

recien_nacido(maria).
?orgulloso(X).
no

Si se suprime el corte en la definicin de padre


devolveraa Pedro . Sin embargo, tal y como se ha
definido,encuantoseencuentraque pedro espadrede
18

ProgramacinPrcticaenProlog

AplicacionesdelCorte

ana yqueana noesunrecinnacido,elPrologpodala


alternativadequePedro tambinespadredeMara
4Lainclusindecortespuedehacerqueelsistemano
encuentrealgunassoluciones.
4 El exceso de cortes en un programa dificulta la
legibilidad.

8.5.1 AplicacionesdelCorte
Engeneral,lautilizacindelcortedebeserexaminadaconprecaucin.Enmuchasocasionesconvienesustituirel
corteporconstruccionesqueencapsulensuutilizacin.

8.5.1.1

IndicaralSistemaquehaescogidolareglacorrecta(ifthenelse)

soloMujeres([],[]).
soloMujeres([X|Xs],[X|Ys]):mujer(X),
soloMujeres(Xs,Ys).
soloMujeres([X|Xs],Ys):hombre(X),
soloMujeres(Xs,Ys).

soloMujeres(Xs,Ys):YscontienelasmujeresdeXs

Si se hace backtracking, el predicado chequear


msalternativascomprobandosilasmujeresson,a
suvez,hombres.

|?soloMujeres3([ana,pedro,maria],V).
V=[ana,maria]
no

soloMujeres1([],[]).
soloMujeres1([X|Xs],[X|Ys]):mujer(X),!,
soloMujeres1(Xs,Ys).
soloMujeres1([X|Xs],Ys):hombre(X),
soloMujeres1(Xs,Ys).

soloMujeres1 : Si se inserta un corte tras la


condicin mujer se le indica al sistema que no

soloMujeres2([],[]).
soloMujeres2([X|Xs],[X|Ys]):mujer(X),!,
soloMujeres2(Xs,Ys).
soloMujeres2([X|Xs],Ys):soloMujeres2(Xs,Ys).

soloMujeres2: Utilizando el corte, si el sistema

ifThenElse(Cond,X,Y):call(Cond)!,call(X).
ifThenElse(Cond,X,Y):call(Y).

busque ms alternativas cuando encuentra una


mujer.

encuentra una mujer, no va a chequear si es un


hombre. La condicin de que sea un hombre,
podrasuprimirse.

Elesquemaconseguidopuedegeneralizarse.

soloMujeres3([],[]).
soloMujeres3([X|Xs],Ys1):ifThenElse(mujer(X),
Ys1=[X|Ys],
Ys1=Ys),
soloMujeres3(Xs,Ys).

ifthenelse(Cond,X,Y):Si Cond entonces ejecuta


X sino, ejecuta Y.

soloMujeres4([],[]).
soloMujeres4([X|Xs],Ys1):(mujer(X)>Ys1=[X|Ys]
ElpredicadoifThenElseestpredefinidomediante
Ys1=Ys),

soloMujeres4(Xs,Ys).

8.5.1.2

eloperador>.

Negacinporfallo

Ellenguaje Prolog utilice un subconjunto de la lgica de predicados de primer orden (clusulas Horn ) lo que
impidemodelizarciertassituacionesconconocimientonegativo.Lanegacinporfalloesunaaproximacinalas
tcnicas de representacin de conocimiento negativo. La idea intuitiva es, si se detectaque algonose cumple,
entonces,sesuponequeesfalso.
animal(X):perro(X).
animal(X):serpiente(X).
serpiente(kika).
perro(kiko).

Sedesearepresentarelsiguienteconocimiento:

A Ana le gustan todos los animales salvo las


serpientes
failesunpredicadointernoquesiemprefalla.
19

ProgramacinPrcticaenProlog

AplicacionesdelCorte

le_gusta(ana,X):serpiente(X),!,fail.
le_gusta(ana,X):animal(X).
|?le_gusta(ana,kika).
no
|?le_gusta(ana,kiko).
yes

falla_si(X):call(X),!,fail.
falla_si(X).
le_gusta2(ana,X):falla_si(serpiente(X)),
animal(X).
|?le_gusta2(ana,kika).
no
|?le_gusta2(ana,kiko).
yes

Sepuedegeneralizarelpatrndenegacinporfallo.

falla_si(X): fallasielobjetivoXsecumpleysecumple
siX falla.
4 El predicado falla_si est predefinido en Prolog
Standardcomoeloperador:\+.
& En muchos sistemas, el predicado \+ se conoce
como not .EnladefinicinStandardsedecidievitarel
predicadonotparaquelosusuariosnoloconfundiesen
conunanegacincomn.
El smbolo \+ pretende ser una representacin del
smbolomatemtico? (nodemostrable)

|?le_gusta2(ana,X).
no
|?le_gusta2(ana,X).
no

le_gusta3(ana,X):animal(X),
falla_si(serpiente(X)).

Con variables sin instanciar no funciona. En cuanto


encuentra una serpiente, falla y no busca ms
alternativas.
Enestacaso,puedecorregirsecambiendodeordenlos
objetivos.
4 Al introducir negacin por fallo el orden de los
objetivosinfluyeenlosresultados.

& La raz del problema es que la frase A Ana le gustan todos los animales salvo las
serpientes,seformalizaraenlgicacomo
"x(animal(x) serpiente(x) le_gusta(ana,x))
yalpasarlaaformaclausalseobtendraunaclusulacondosliteralespositivos(no Horn )

8.5.1.3

Reglas pordefecto

pension(X,invalidez):invalido(X),!.
pension(X,jubilacion):jubilado(X),!.
pension(X,nada).
invalido(pedro).
jubilado(tomas).
jubilado(pilar).
|?pension(tomas,X).
X=jubilado

pension(P,Tp): Tp es el tipo de pension que le


correspondealapersonaP

J Conpreguntassencillasfunciona

|?pension(ana,X).
X=nada

|?pension(tomas,nada).
yes

KNofunciona,deberaresponderqueno!

|?pension(X,jubilacion).
X=tomas

L Tampocofunciona,lehaquitadolapensinaPilar

|?

pension2(X,invalidez):invalido(X).
pension2(X,jubilacion):jubilado(X).

4Laintroduccindecortespuedehacerquealplantear
al sistema preguntas no contempladas, las respuestas
seanerrneas.
Lasolucinseraquitarelcorteyutilizardosniveles.
20

ProgramacinPrcticaenProlog

Entrada/Salida

asigna(X,P):pension2(X,P).
asigna(X,nada):\+pension2(X,P).

pension2(P,Tp): Tp es el tipo de pension que le


correspondealapersonaP

|?asigna(X,jubilacion).
X=tomas

asignacion(P,Ta):Ta es el tipo de asignacin que le


correspondeaP

X=pilar
no

8.5.1.4

Finalizargeneracindealternativas(once)

En algunas ocasiones, puede ser necesario finalizar la generacin de alternativas devolviendo nicamente la
primera solucin encontrada. Las razones pueden ser, porque se conoce que el problema slo va a tener una
solucin,oporquenotieneimportanciadevolverunasolucinuotrayseoptapordevolverlaprimera.Mediante
uncorte,puedefinalizarselageneracindeotrassoluciones.
hayPadresJubilados:Se sumple si en la base
hayProgJubilados:progenitor(X,Y),jubilado(X),!.
de conocimiento existe algun progenitor
jubilado.

once(X):call(X),!.

once(X):Secumplesise cumple el objetivo


X,peronointentareejecutar X.

hayProgenitoresJubilados:once((progenitor(X,Y),
jubilado(X))).

4 Los dobles parntesis son necesarios para


queelsistemareconozcalasintaxis.
( El predicado once est predefinido en el
Prolog Standard, sin embargo, muchos
sistemas comerciales no lo utilizan o utilizan
elpredicado one

8.6 PredicadosExtralgicos
8.6.1 Entrada/Salida
EnProlog laEntrada/Salida(E/S)serealizamedianteefectoslaterales.LospredicadosdeE/Stienenunescaso
valorlgico,pero,alserencontradosporelsistema,ejecutanlasaccionescorrespondientes.
( El principal cambio producido al standarizar el lenguaje Prolog ha sido la redefinicin de los predicados
clsicosde E/S. Sin embargo, muchas implementaciones continan ofreciendo el repertorio anterior. Se indica
medianteelsmbolo ( aquellospredicadosquenoson standard.

8.6.1.1

E/Saniveldetrminos

Lossiguientespredicadosleenyescribentrminos Prologcompletos
Predicado Secumplecuando:
Efectolateral
EjemplosSencillos
Standard
write(X) Siempre
Escribeelvalordeltrmino X |?write(f(x,3+4)). write
f(x,3+4).
yes

read(X)

SiesposibleunificarXconel Leeuntrmino Prolog


valorledo

|?read(X).
read
|:<usuario>f(x,3+4).
X=f(x,3+4)

4Nosehacebacktracking.

4LostrminosPrologdeben |?read(X),X=2.

Analizaloscaracteresde
entradahastaencontrarun
trminoy,siunifica, se
cumple,sino,falla.

acabarenpunto

|:<usuario>3.
no

display(X) Siempre

EscribeelvalordeltrminoX |?display(f(x,3+4)). write_canonical


f(x,(+)(3,4))
ennotacinfunctor
yes

nl

Escribeunsaltodelnea

Siempre

nl

21

ProgramacinPrcticaenProlog

Entrada/Salida

saludo:write(Tunombre?),
read(N),
write(Hola),write(N).

saludo: Pidealusuariounnombre(trminoProlog),lolee
ylomuestraporpantalla.

|?saludo.
Tunombre?
|:<usuario>juan.
Holajuan
yes
writeln([X|Xs]):write(X),writeln(Xs).
writeln([]):nl.
%Predefinido
repeat.
repeat:repeat.

repeat: Predicado que siempre se cumple y que tiene un


infinitonmerodesoluciones.,
cuadrados:Solicita numeros al usuario hasta que ste

cuadrados:repeat,
leeNumero(X),
procesa(X),
!.

teclea0.Paracadanmero,imprimesucuadrado.

leeNumero(X):repeat,
write('Numero?'),
read(X),
number(X),
!.

4LosbuclesPrologconrepeattienensiempreunmismo
esquema:
bucle:repeat,
<cuerpodelbucle>,
<condicindesalida,sisecumple fin>,
!.

procesa(0):!.
procesa(X):RisX*X,
writeln([X,'^2=',R]),
fail.

8.6.1.2

El corte al final es necesario para que el predicado no


intentereejecutarsedenuevo.

E/Saniveldecaracteres

Predicado
get0(X)
get(X)
put(X)

Secumplecuando:

Efectolateral

Standard

get_char
Si es posible unificar el Leeuncaracterdelteclado
caracterleidocon X
Si es posible unificar el Lee el siguiente caracter
caracterleidocon X
distintodeblanco.
put_char
Siempre
Escribeelcaracter X

leeLsPals(Pals):once((get0(C),leePals(C,Pals))). leeLsPals (X):ObtieneunalistadeAtomosdela


leePals(C,[]):punto(C),!.
leePals(C,[Pal|Pals]):alfaNum(C),!,
leePal(C,Pal,Csig),
leePals(Csig,Pals).
leePals(C,Pals):get0(Csig),
leePals(Csig,Pals).

entrada
|?leeLsPals(X).
|:Estaesunacadenacon1numero.
X=['Esta',es,una,cadena,con,'1',numero]

leePal(C1,Pal,Csig):cogerCodsPal(C1,Cods,Csig),
atom_chars(Pal,Cods).
cogerCodsPal(C1,[C1|Cars],Cfin):alfaNum(C1),
get0(Csig),
cogerCodsPal(Csig,Cars,Cfin).
cogerCodsPal(C,[],C):\+alfaNum(C).
alfaNum(C):(C>=0'a,C=<0'z)
(C>=0'A,C=<0'Z)
(C>=0'0,C=<0'9).

( La forma de obtener el cdigo ASCII de un


caracter vara de un sistema a otro. En LPA, 0a
representaelcdigoASCIIdelcaractera.

punto(0'.).
espacio(0').

22

ProgramacinPrcticaenProlog

8.6.1.3

AccesoalaBasedeDatos

E/Sconficheros

EstaparteesunadelasquemsdifiereconelPrologStndar donde se utilizan manejadores para trabajar con


streamsoflujosdeE/S.

Predicado
tell(F)
see(F)
told
seen
telling(F)
seeing(F)

Secumplecuando:
Si no hay errores de
apertura
Si no hay errores de
apertura
Siempre
Siempre
Unifica F conelnombredel
stream desalidaactual
Unifica F conelnombredel
stream desalidaactual

verFich:write('Nombrefichero?'),
read(N),
seeing(Antes),
see(N),
bucle,
seen,
see(Antes).

Efectolateral
Standard
AbreF como streamde salida open
actual
AbreF como streamactual de open
entrada.
Cierra streamdesalidaactual close
Cierra streamdeentradaactual close
Ninguno
Ninguno

verFich:Pregunta un nombre de fichero al usuario, lo


abreyvisualizasucontenidoenmaysculas.

bucle:repeat,
get0(C),
minMay(C,Cm),
put(Cm),
at_end_of_file,
!.

minMay(C,Cm):minuscula(C),!,
CmisC0'a+0'A.
minMay(C,C).
minuscula(C):C>=0'a,C=<0'z.

8.6.2 AccesoalaBasedeDatos
Lossistemas Prolog ofrecen la posibilidad de modificar en tiempo de ejecucin el contenido de la base de
conocimiento.

Predicado
asserta(T)
assertz(T)
retract(T)

Secumplecuando:

Efectolateral

Siempre

Aade al principio de la base


deconocimientoeltrminoT
Siempre
Aade al final de la base de
conocimientoeltrmino T.
SiTunifica con el trmino Elimina de la base de
eliminado.
conocimientoeltrmino T

:dynamic(fib/2).
fib(0,1).
fib(1,1).
fib(X,Y):X>1,X1isX1,fib(X1,Y1),
X2isX2,fib(X2,Y2),
YisY1+Y2,
asserta((fib(X,Y):!)).

fib(X,Y): Y es el Xsimo nmero de la sucesin de


Fibonacci.Sememorizanresultadosintermedios.
4Parapoderinsertardinmicamenteunpredicadoenla
basedeconocimiento,debeutilizarseladirectiva
:dynamic(P/A).
queindicaalsistemaqueelpredicadoP dearidadAes
dinmico.

23

ProgramacinPrcticaenProlog

AccesoalaBasedeDatos

8.7 PredicadosdeSegundoOrden
Supngasequesedeseaconstruirunprogramaquebusquetodaslassolucionesparaunobjetivo dado. Con los
predicadosconsideradoshastaahora,latareanoessencilla.ElproblemaesquePrologdevuelvelassolucionesal
realizar backtracking. Sera necesario forzar el backtracking para cada solucin e ir recogiendo las soluciones
encontradas. El problema es que la pregunta est fuera del modelo lgico (toda la informacin de una
computacin,sepierdealrealizar backtracking).Lasolucinesutilizarlossiguientespredicados:

Predicado
Secumplecuando:
findall(T,C,L) Leslalistadetodaslasinstanciasdeltrmino T talesqueelobjetivo Csecumple.
Lalistadesolucionesnoseordena(seinsertanenelordenenqueaparecen)ypuede
contenerelementosrepetidos.
Sinohaysoluciones,seobtienelalista vaca
Traselobjetivo, lasvariablesdeTy Cpermanecensininstanciar.
bagof(T,C,L) Se cumple si L es la lista de todas las instancias de T tales que el objetivo C se
cumple.

C puede tener la forma: V1^V2^^Vn^Objetivo indicando que las variables


V1,V2,,Vnestncuantificadasexistencialmente.
Sinosecumple Celpredicadofalla

setof(T,C,L)

L noseclasificaypuedecontenerelementosduplicados.
Similarabagofsalvoquelalista de resultados se clasifica y se eliminan elementos
duplicados.

hijos(Xs):findall(X,progenitor(Y,X),Xs).
|?hijos(V).
V=[belen,belen,lucia,ana,pedro,jose,maria]
hijos1(Xs):bagof(X,progenitor(Y,X),Xs).
|?hijos1(V).
V=[ana,pedro]

hijos(L): seobtienelalista dehijos


Confindalllalistapuedecontenerduplicadosynoest
ordenada.
Con bagof las variables no cuantificadas, indican
posibles soluciones. Para cada posible valor de la
variable (en el ejemplo, para cada progenitor), se
devuelvelalistadesushijos.

V=[jose,maria]
V=[belen]
V=[belen,lucia]
no
hijos2(Xs):bagof(X,Y^progenitor(Y,X),Xs).
|?hijos2(V).
V=[belen,belen,lucia,ana,pedro,jose,maria]
hijos3(Xs):setof(X,Y^progenitor(Y,X),Xs).

Las variables pueden cuantificarse existencialmente


mediante^,actuandodeformasimilarafindall

setof eliminaordenalalista yeliminaduplicados.

|?hijos3(V).
V=[ana,belen,jose,lucia,maria,pedro]

Elefectodeestospredicadossepodrasimularmedianteefectoslaterales,almacenandolassolucionesenlabase
dedatosconlospredicadosdefinidosenlaseccin 8.6.2.

8.8 Directivas
El Prolog Standard define una serie de directivas que indican al sistema tareas a realizar u opciones de
compilacin.
:ensure_loaded(F).
Indicaalsistemaquecargueelfichero F
:multifile(P/N).
Indica que el predicado P de aridad N puede definirse en varios
ficheros.Pordefecto,lasdefinicionesdebenestarenunsolofichero.
:dynamic(P/N).
IndicaalsistemaqueladefinicindelpredicadoPdearidadNpuede
modificarsedeformadinmica
:initialization(C).
DeclaraqueelobjetivoCdebeserejecutadotrascargarelfichero.
:op(Prioridad,Asociatividad,Atomo). Define Atomo comounoperador con la Prioridad y Asociatividad
dadas
24

ProgramacinPrcticaenProlog

AccesoalaBasedeDatos

9 EjerciciosPropuestos
Clave:

.
..
...
....

MuyFcil
Fcil
Medio
Largo(proyectosdeprogramacin)
n

1.cambia(Xs,Ys): SiXs=[x1 ,x2,...xn],entoncesYs=[y1 ,y2 ,...,yn]deformaque

yi =xi +

xi parai=1..n (.)

i
=1

?cambia([1,3,2],Xs).
Xs=[7,9,8]
2.sucesion(N,Xs): Xs esdelaforma[x1,x2 ,...xn ]dondeX
1=0,X
2=1 y x
i+2=2*x
i+x
i+1
Ejemplo: ?sucesion(8,V).
V=[0,1,1,3,5,11,21,43]

(.)

3.diferentes(Xs,N):N eselnumerodeelementosdiferentesdelalistaXs(.)

Ejemplo:?diferentes([1,2,2,1,1,3,2,1],V).
V=4
4. Supngasequesehacargadoelsiguienteprogramaenunsistema Prolog.
a(X,Y):b(X,Y).
a(X,Y):c(X,Y).
b(X,Y):d(X),!,e(X,Y).
b(X,Y):f(X,Y).
c(1,2).c(1,3).
d(1).d(2).
e(2,3).
f(3,4).f(3,5).

Indicarcualessonlasrespuestasdelsistema(suponerquesesolicitantodaspor backtracking)alejecutar:(.)
a. ?a(1,X).
b. ?a(2,X).
c. ?a(3,X).
5.rep(Xs,V) :VeselrepresentantedecimalequivalentealalistadeenterosXs.(.)

Ejemplo:
?rep([1,4,6],V).
V=146

6.monte(Xs) :SecumplesiXstieneformademonte.Esdecir,escrecientehastaunelementoydecrecientedesde
eseelementohastaelfinal.(.)
Ejemplo:?monte([1,3,5,6,4,3,0]).
yes

7.cambio(X,Xs) :Xseslalistamonedasde1,5,25100necesariasparaalcanzarlacantidadX(.)
?cambio156
[100,25,25,5,1]
8. decBin(D,B): B eselvalorbinariodeD
?decBin(13,V).
V=[1,1,0,1]
?decBin(V,[1,0,1,1]).
13

(..)

9.combs(Xss,Ys): SecumplesiYs esunalistaenlaqueelprimerelementoesalgunodeloselementosdela

primerlistadeXss, elsegundoelementoesalgunodeloselementosdelasegundalistade Xss y...elnsimo


elementodecadasublistaesalgunodeloselementosdelansimalistade Xss. Mediantebacktracking,debe
devolvertodaslasposibleslistas Ysquesatisfagandichacondicin.(.. )
Ejemplo:
?combs([[1,2,3],[4,5],[6]],V).
V=[1,4,6]
V=[1,5,6]
V=[2,4,6]
V=[2,5,6]
25

ProgramacinPrcticaenProlog

AccesoalaBasedeDatos

V=[3,4,6]
V=[3,5,6]
No
10.triangulo(N): muestraporpantallauntriangulode N filas(..)
Ejemplo:?triangulo(4).
*
***
*****
*******
11.sumCombs(Xss,V): Veslasumadetodaslasrepresentacionesdecimalesdelaslistasobtenidasmediantelas

combinacionesdelejercicio(.. )
?sumCombs([[1,2,3],[4,5],[6]],V).
V=1506
12.decBin(D,B):B eselvalorbinariode D
?decBin(13,V).
V=[1,1,0,1]
?decBin(V,[1,0,1,1]).
V=13

(..)

13. varsRep(N,Xs,Vs):VssonlasvariacionesconrepeticindeloselementosdeXstomadosdeNenN
?varsRep(3,[0,1],Vs).(..)
Vs=[[0,0,0],[0,0,1],[0,1,0],[0,1,1].[1,0,0],[1,0,1],[1,1,0],[1,1,1]]
?varsRep(2,[0,1,2],Vs).
Vs=[[0,0],[0,1],[0,2],[1,0],[1,1],[1,2],[2,0],[2,1],[2,2]]

14. palabras(Cad,Pals):Palsesunalistadeestructurasdelaforma:c(P,N),dondePesunapalabradeCadyNes
el nmero de veces que se repite dicha palabra en Cad. Se deben ignorar las diferencias entre maysculas y
minsculasyloscaracteresdepuntuacin. (...)
?palabras("Noduermenadieporelmundo?.No,noduermenadie.",Ps).
Ps=[c(no,3),c(duerme,2),c(nadie,2),c(por,1),c(el,1),c(mundo,1)]

15.busca(Exp,Cad,Ps):PsesunalistadepalabrasdeCadqueencajenconlaexpresinregularExp.Sedeben
ignorarlasdiferenciasentremaysculasyminsculasyloscaracteresdepuntuacin.(...)
?busca(*e,"Noduermenadieporelmundo?.No,noduermenadie.",Ps).
Ps=[duerme,nadie,duerme,nadie]

16. tartaglia(N): muestraporpantallalasNprimerasfilasdeltringulodeTartaglia.(...)


Ejemplo: ?tartaglia(5)
1
11
121
1331
14641

17.Desarrollarunprogramaquecalculeysimplifiquederivadasdefuncionesdeformasimblica.(...)
18. Construir un programa de gestin de una agencia matrimonial. El programa debe almacenar datos de
personas,ascomosuspreferenciasy,buscarlasmejorescombinacionesdeparejas.(...)
19. Construir un programa que maneje polinomios. El programa ser capaz de leerpolinomios a a partir de la
entradadelusuario,sumarlos,multiplicarlosyrestarlos.Adems,elprogramabuscarracesdeformaanalticao
numrica. El programa no se restringir a polinomios cuadrticos y se puede considerar el clculo de races
complejas.(....)
20.Escribir unprogramainteractivoque jueguefinalesdepartidasdeajedrez.Se puedentomarfinales de una
reinacontradostorres,porejemplo.(....)
21.Escribirunprogramaquetomeunarepresentacindeunamatrizdepuntoscuadrada(detamao10x10,por
ejemplo)ydecidaquletradelalfabetorepresenta.Elpatrnpodrateneralgunadistorsinoambigedadqueel
programadebesercapazdeafrontar.(....)
22.Escribirunalgoritmoquetomecomoentradaunmapadivididoenregiones(sealmacenainformacindequ
regionestienenfronteraencomnentres)yasigneuncoloracadaregindeformaquenohayadosregiones
adyacentesconfronteracomn.(....)
26

ProgramacinPrcticaenProlog

AccesoalaBasedeDatos

23.Constuirunprogramainteractivoquemuestreun promptporpantallayreconozcalossiguientescomandos:
Fin
Findelprograma
VerVar
MuestraelvalordeVarenpantalla
Var=Expresin
AsignaaVarelvalordeExpresin
Expresin
Evalalaexpresinymuestraelresultadoenpantalla
DondeExpresinesunaexpresinaritmticaformadaporsumas,restas,multiplicaciones,divisiones,constantes
numricasyvariables.Unejemplodesesinpodraser:(....)
$x=3*2+4*(6+2).
OK
$x+1.
39
$y=x+1.
OK
$y+2.
40
$x=2*3.
OK
$y+2.
8
$V(y).
x+1
$fin.
Adios!

27

ProgramacinPrcticaenProlog

AccesoalaBasedeDatos

10 BibliografaComentada
Acontinuacinsepresentaunabibliografacomentadadeloslibrossobreellenguaje Prolog o la programacin
lgicamsdestacablesporelautor.Seincluyeunsignoqueresumeelprincipalmotivodeinclusindellibroenla
bibliografa.Elsignificadodedichossmboloses:
4
LecturaFundamentaloreferenciaclsica
.
Destacableporlasaplicacionesprcticas
&
Destacableporlaspresentacionestericas
4
Destacableparaconsultaoreferencia
R.Bird,O.deMoor, AlgebraofProgramming. PrenticeHallIntl. Series inComputerScience,
ISBN:013507245X,1997
Presenta la programacin desde un punto de vista algebraico (siguiendo la teora de la categora) y
centrndoseenelparadigmafuncional. Aunque el libro no menciona el lenguaje Prolog, presenta una
metodologa de resolucin de problemas mediante relaciones lgicas y generaliza el tratamiento de
funciones de orden superior recursivas de una forma similar a los patrones recursivos utilizados.
Reservadoparaprogramadoresconinquietudesmatemticas.&

[Bird,97]

I.Bratko,Prolog, ProgrammingforArtificialIntelligence .AddisonWesley,


ISBN:0201416069,1990
Ellibrosedivideendospartes,unaprimeradeintroduccinallenguajeyunasegundadepresentacinde
aplicacionesalainteligenciaartificial.Ejemploscomprensiblesyaplicacionesconvencionales..

[Bratko,90]

[Covington,97] M.A.Covington,D.Nute,A.Vellino, PrologProgramminginDepth. Prentice Hall,ISBN: 0


13138645X,1997
Resolucin de aplicaciones de Inteligencia Artificial mediante Prolog. No separa claramente la
componentedeclarativadelaprocedural.Contieneunsugestivocaptulodedicadoaexpresaralgoritmos
proceduralesenlenguaje Prolog yunosanexosresumiendolanormaISOdePrologydiferenciasentre
diversasimplementaciones..
W.F. Clocksin, C.S. Mellish, Programacin en Prolog, Coleccin CienciaInformtica, Ed.
GustavoGili,ISBN:8425213398,1981
EsellibrodeintroduccinallenguajePrologclsico.Apesardesuedad,ellibrosiguesiendounabuena
fuente de obtencin de ejemplos sencillos de funcionamiento del lenguaje. Adems, la traduccin
mantieneeltipo.4

[Clocksin,81]

[Clocksin,97] W.F.Clocksin,ClauseandEffect.SpringerVerlag,ISBN:3540629718,1997
Con un planteamiento similar al de los presentes apuntes (aunque con un nivel algo ms elevado),
presentauna introduccinprctica, concisa y entretenida alaprogramacinen Prolog.Estamitadde
caminoentre[Clocksin,81]y[OKeefe91]4
[Deransart,96] P. Deransart, A. EdDbali, L. Cervoni, Prolog: The Standard. Reference Manual. Springer
Verlag,ISBN:3540593047,1996
Manual de Referencia del Prolog Standard. Para aquellos que deseen construir implementaciones
standarddeProlog oparaprogramadoresmuypreocupadosporlaportabilidad.Losejemplosnoestn
pensadosparaensaaraprogramaren Prolog ,sinoparadistinguircaractersticasdellenguaje. 4
[Flach,94]
P.Flach,SimplyLogical,IntelligentReasoningbyExample.JohnWiley&Sons.ISBN:0471
941522,1994
Comienzaconunaperfectaintroduccinalasprincipalestcnicasdeprogramacin Prologparapresentar
deunaformaclarayconcisaaplicacionesdellenguajeensistemasdeinteligenciaartificial. .
M.Fitting,FirstOrderLogicandAutomatedTeoremProving. SpringerVerlag, ISBN: 0387
945938,1996
Introduccin a las tcnicas de demostracin automtica en lgica de proposiciones y predicados
utilizando Prologcomolenguajedeimplementacindeejemplos.&

[Fitting,96]

[Lloyd,93]
J.W.Lloyd,FoundationsofLogicProgramming.SpringerVerlag,ISBN:3540181997,1993
Recomendableparaellectorinteresadoenprofundizarenlasbasestericasdelaprogramacinlgica &
28

ProgramacinPrcticaenProlog

AccesoalaBasedeDatos

[OKeefe,90] R.A.OKeefe,TheCraftofProlog.MITPress,ISBN:0262150395,1990
Con un planteamiento avanzado, el libro es fundamental para aqul que se considere un programador
serio en Prolog . El captulo de tratamiento de secuencias proporciona una idea de los patrones de
recursividadofrecidosenestosapuntes.4
P.Ross, Advanced Prolog, techniques and examples. AddisonWesley, ISBN: 0201175274,
1989
Presentavariasaplicacionesconunplanteamientorigurosoyavanzado..

[Ross,89]

[Sterling,94]
L.Sterling,E.Shapiro. TheArtofProlog. TheMITPress,ISBN:0262193388,1994
Referencia clsica e imprescindible del lenguaje Prolog. Realiza la presentacin partiendo del ncleo
declarativodellenguajeyofreciendogradualmentelascaractersticasmenosdeclarativas.Contieneotras
dospartesinteresantesdemtodosavanzadosyaplicaciones.4
Y. Shoham, Artificial Intelligence Techniques in Prolog . Morgan Kaufmann Publishers, Inc.
ISBN:1558603190,1994
SecentradirectamenteenlapresentacindeaplicacionesdeinteligenciaartificialenPrologpartiendode
queellectorconoceellenguaje.Destacableporlasaplicacionespresentadas..

[Shoham,94]

29

ProgramacinPrcticaenProlog

AccesoalaBasedeDatos

11 Indice
float,15

A
abuelo,16
algunHombre,8
alisar,15
animal,19,20
antepasado,4
rbol,13,18
rbolbinariodebsqueda,13
arg,15,17
Aritmtica,9,11
asserta ,23
assertz,23
atom,14,15,22
atom_chars,14,22
atomic,15,17

funcin,5,11,27
functor ,15,17,21

G
Generacin,8,9,11,12
get,22
get0,22,23
grafo,4
grande,5

H
hayProgJubilados,21
Hecho,3
hijos,4,24
hombre,4,6,8,16,18,19
hombres,6,9,19
horizontal,5

backtracking,3,6,7,9,18,19,21,24
bagof,24

bueno,3

C
cabeza,4,5,6,18
call,17,19
Casobsico,4
CasoRecur sivo,4
chequeodeocurrencias,5,17
Chequeodetipos,14
Clasificacin,12
comp,13
compound,15,17
comprime,13
concat,8,13,15
Conversindetipos,14
Corte,18,19
creaArbol,13
cuadrados,22
cuida,3

D
display,21

ifThenElse,19
inserta,12,13,19
insertArbol,13
integer ,14,15
intervalo,11,12
invalido,20
is ,9,10,11,12,13,15,17,22,23

J
jubilado,20,21

L
le_gusta,19,20
leeLsPals,22
leeNumero,22
list,15
lista,6,7,8,9,11,12,13,14,15,22,24
Lista,6,11
listArbol,13
long,11

E
madre,3,4
mayor,5,11,12,13,16
mezcla,12,13
mujer,4,9,19

edad,9,27
elimina,7,18,24
Entrada/Salida,21
estructurarecursiva,13

F
fact,10
fail,19,20,22
falla_si,20
fib,23
filtrado,12,15
filtraHombres,9
findall,24

Negacinporfallo,19
nl,22
nonvar ,16,17
noOcurre,17
noPertenece,6
not,20
number ,14,15,22

30

ProgramacinPrcticaenProlog

AccesoalaBasedeDatos

number_atom,14
number_chars,14

S
O

objetivo,3,9,11,17,20,21,24
once,21,22
ordenaBruto,12
ordenada,12,24
ordenaIns,13
orgulloso,18

P
padre,15,18
par,10,12
pares,12
paro,3
particion,12
pension,20
permutacion,9
Permutacin,9
perro,19
pertenece,6,7,8,9
PredicadosInternos,14
Predicadosmetalgicos,16
prefijo,8
prod,11
prodEscalar,11
progenitor,3,4,5,16,17,18,21,24
put,22,23

saludo,22
see,23
seeing,23
seen,23
SegundoOrden,24
serpiente,19,20
setof,24
sinDuplicados,9
Sintaxis,3
soloMujeres,19
sublista,8

SubstitucindeRespuesta ,3
substitucinvaca,5
subTer,15
subTerm,15
sufijo,8
sum1,11
suma,10
sumAcum,11
sumaLogica,15

T
tell,23
telling,23
todosIguales,7
told,23

U
unifica,6,9,10,16,17,21,23
Unificacin,5

quicksort,13

V
R

read,21,22,23
recien_nacido,18
Recursividad,4,6,11
Regla,3,4,20
Reglaspordefecto,20
repeat,22
repite,12,13
resolucin,3,5,11,16,18,27
retract,23

var ,16,17
verFich,23
vertical,5

W
write,17,21,22
writeln,22

Das könnte Ihnen auch gefallen