Manual Lab Prolog
Manual Lab Prolog
UNIDAD 1 - PROLOG
1.1 INTRODUCCIÓN.
Estas dos aplicaciones son similares y se pueden resolver usando Prolog .El
objetivo para Prolog era proporcionar las especificaciones de una solución y
permitir que la computadora dedujera la secuencia de ejecución para esa
solución, en vez de especificar un algoritmo para la solución de un problema,
como es el caso normal de casi todos los lenguajes.
1.2 HISTORIA.
1
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
Prolog tiene una sintaxis y semántica simples. Puesto que busca relaciones
entre una serie de objetos, la variable y la lista son las estructuras de datos
básicas que se usan. Una regla se comporta en forma muy parecida a un
procedimiento, excepto que el concepto de unificación es más complejo que el
proceso relativamente sencillo de sustitución de parámetros por expresiones.
2
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
3
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
2.1 DATOS.
ana
pedro
x25
x_25
procedmiento_uno
categoria_x
<---->
=====>
....
'Tom'
'Polo_Norte'
- NÚMEROS:
1
1313
0
-97
3.14
-0.0035
4
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
100.2
2.2 VARIABLES.
Las variables son cadenas de letras, dígitos y el signo '_'. Estas empiezan con
una letra mayúscula o el símbolo '_':
X
Objeto2
_23
Resultado
_x23
Lista_Participantes
hijo(X) :- padre(X,_).
2.3 OPERADORES.
- ARITMÉTICOS:
5
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
+ SUMA
- RESTA
* MULTIPLICACIÓN
/ DIVISIÓN
// DIVISION ENTERA
MOD RESIDUO
^ POTENCIA
OPERACIÓN DESCRIPCIÓN
sin(T) Seno de T
cos(A) Coseno de A
tan(C) Tangente de C
- RELACIONALES:
= IGUAL QUE
> MAYOR QUE
>= MAYOR O IGUAL QUE
>= MENOR O IGUAL QUE
<> DESIGUAL QUE
=/= DIFERENTE QUE
is EVALUADOR DE EXPRESIÓN
seed GENERADOR DE NÚMEROS ALEATORIOS
6
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
2.4 PREDICADOS.
2.5 ESTRUCTURAS.
Donde Día es una variable que puede ser instanciada por cualquier objeto en
cualquier momento de la ejecución del programa. Sintácticamente, todos los
objetos de datos en Prolog son términos. Por ejemplo, enero y
date(1,enero,1975) son términos.
2.6 CONSULTAS.
7
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
2.7 COMENTARIOS.
Cuando se quiere hacer un comentario que cuenta con más de una línea, se
hace de la siguiente manera:
/*
Comentario x
Comentario y
*/
% Comentario
- TIPOS DE RELACIONES:
8
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
- EN LINUX
wget http://gollem.science.uva.nl/cgi-bin/nph-download/SWI-
Prolog/binaries/pl-5.6.25-268.i586.rpm
alien -d pl-5.6.25-268.i586.rpm
Instala:
dpkg -i pl-5.6.25-268.i586.deb
Ejecuta:
pl
Una vez ejecutado esto desde la terminal puedes compilar los programas de
prolog.
Para escribir los programas, solo abre cualquier editor de texto que tengas a la
mano, escribe el código y guarda el archivo con terminación .pl.
9
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
- EN WINDOWS
10
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
:?- easter(2000,Y,D).
Y=4,
D=23.
C:/Pro386w/examples/Easter.pl
11
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
P1^P2^...^Pn⇒Q
Q:-p1 ^p2 ^...^Pn Cláusula = Clause
↑↑
Implicación Premisa
12
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
Base de conocimiento
13
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
En la base de conocimientos:
En la consola:
?-juan.
yes
?-padre(juan,jose).
yes
?-padre(X,jose).
X=juan
yes
?-ancestro(pedro,jose).
yes
14
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
Consulta:
:?-padre(pedro,jose).
yes
Consulta:
:?-ancestro(pedro,luis).
yes
15
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
X=pedro, Y=luis.
Consulta:
:?-ancestro(X,luis).
X=jose
X=X, Y=luis
Por lo tanto, la coincidencia fue total, así que se deduce que X=jose. El padre
de Luís es José.
16
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
4.1 LISTAS.
[member1,member2,...,memberN]
Los miembros de una lista deben ser nombres válidos de objetos, pero todos
los miembros deben ser declaraciones de un mismo dominio.
Ejemplo:
["Maria","Ana","Juan"]
[33,25.51,20,10,7]
[a,b,c,d,e,f,g]
La lista puede ser vista, como un objeto don dos partes: [Cabeza|Cola]
a b c d e f g
CABECERA
RESTO
El operador corte, representado por el símbolo “!" nos da un cierto control sobre
el mecanismo de deducción del PROLOG. Su función es la de controlar el
proceso de reevaluación, limitándolo a los hechos que nos interesen.
Supongamos la siguiente regla:
regla:- hecho1,hecho2,!,hecho3,hecho4,hecho5.
17
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
Una interpretación práctica del significado del corte en una regla puede ser que
"si has llegado hasta aquí es que has encontrado la única solución a este
problema y no hay razón para seguir buscando alternativas".
Código:
Consulta:
:?-elemento([a,b,c,d],c).
yes
:?-elemento([a,b,c,d],e).
no
elemento([X|R],X). no.
elemento([X|R],Y):-elemento(R,Y). Todo coincide así que entra al siguiente nivel.
elemento([X|R],X).
X con X, si. R con R, si. X con X, si, puesto que X (el primer elemento de la lista coincide con
el elemento que se busca). Por lo tanto la consola dirá que si.
18
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
4.4 ARIDAD.
Código:
Consulta:
:?-aridad([a,b,c,d,e],N).
N=5.
aridad([ ],0). Aquí tenemos una lista vacía, así que continua a la siguiente línea.
aridad([X|R],N):-aridad(R,Z),N is Z+1.
Aquí todo coincide, pues son variables, así que pasa a la primera acción, que es volver a
empezar pero sin el primer elemento de la lista y así hasta llegar a la e.
19
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
En este nivel vemos que la lista vacía y la variable N coincidirán con el caso
base, así que se dará por terminada la acción aridad(R,Z) por lo que se
continuara con la segunda acción del Nivel 5, N is Z+1
4.5 CONCATENAR.
Concatenar no es más que unir dos elementos o listas. Lo cual se podría decir
que es unir 2 listas, pues una lista puede contener solo un elemento. De esto
concluimos que concatenar es unir la lista L1 y L2 en una lista L3.
Código:
conc([ ],L2,L2).
conc([X|R],L2,[X|Z]):-conc(R,L2,Z).
Consulta:
:?-conc([a,b,c,d,e],[1,2,3],R).
R=[a,b,c,d,e,1,2,3]
20
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
Aquí comenzara a regresar cerrando los niveles y así ir concatenando todos los
elementos el la lista R, terminando así con la conclusión.
R=[a,b,c,d,e,1,2,3]
Código:
Consulta:
:?-inverso([a,b,c],L).
L=[c,b,a].
Aquí entrara al caso base y regresándose para entrar a la segunda acción que
es conc(Z,[X],E) que estará concatenando primero c, luego b y al final a.
21
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
Lx=[1,2,3] Ly=[1,1,2,2,3,3]
Código:
Consulta:
:?-duplicar ([a,b,c],R).
R=[a,a,b,b,c,c]
R=[a,a,b,b,c,c]
L1=[a,b,c,d] Lq=[a,b,c]
Código:
quitar([A],[ ]).
quitar([C|P1],[C|P2]):-quitar(P1,P2).
Consulta :
?-quitar([a,b,c,d],X).
X=[a,b,c]
De regreso:
22
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
L1=[a,b,c,d] Lq=[a,b]
Código:
quitar([A,B],[ ]).
quitar([C|P1],[C|P2]):-quitar(P1,P2).
Consulta :
?-quitar([a,b,c,d],X).
X=[a,b]
De regreso:
L1=[a,b,c,d] Lq=[a,b,d]
Código:
Consulta:
?- borrar(d,[a,b,c,d],L).
23
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
Las compuertas lógicas básicas funcionan bajo las siguientes tablas de verdad:
AND OR NOT
0 0 0 0 0 0 0 1
0 1 0 0 1 1 1 0
1 0 0 1 0 1
1 1 1 1 1 1
En base a estas compuertas podemos tener otras como las NAND, NOR, entre
otras. En el siguiente ejemplo, haremos un programa para resolver el siguiente
diagrama.
Código:
and(0,0,0).
and(0,1,0).
and(1,0,0).
and(1,1,1).
or(0,0,0).
or(0,1,1).
or(1,0,1).
or(1,1,1).
not(0,1).
not(1,0).
circ(A,B,C,Z):-and(A,B,X),and(B,C,Y),not(Y,R),or(X,R,Z).
Consulta:
?-circ(0,1,0,Z).
Z=1
24
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
Código:
and(0,0,0).
and(1,1,1):-!.
and(_,_,0).
or(0,0,0):-!.
or(_,_,1).
not(0,1).
not(1,0).
circ(A,B,C,Z):-and(A,B,X),and(B,C,Y),not(Y,R),or(X,R,Z).
Se necesitan dos 1’s para que se cumpla la premisa de una compuerta AND,
cualquier otra cosa, será falso.
En la compuerta OR, solo cuando se tienen dos 0’s de entrada que dan falso,
en los demás casos dará verdadero. (_, _,0) significa que no importa lo que se
ponga, siempre dará como resultado 0.
Dos caminos posibles para un mismo estado. Observar si acepta una cadena.
Código:
final(e3).
trans(e1,a,e1).
trans(e1,b,e1).
trans(e1,b,e2).
trans(e2,a,e2).
trans(e2,a,e3).
trans(e2,b,e4).
trans(e3,b,e4).
trans(e4,a,e4).
25
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
aceptar(e3,[]).
aceptar(E,[X|R]):-trans(E,X,F),aceptar(F,R).
Consulta:
?-aceptar(e1,[a,a,a,b,a,a]).
yes
El programa será valido si tenemos una lista con números pares y nones y
obtenemos dos listas, una con los pares y otra con los nones.
Código:
Consulta:
?-dividir([3,4,6,7],N,P).
N=[3,7],
P=[4,6]
De regreso gracias al caso base ira a pegando una a una cada lista.
26
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
Primera pasada:
{21,40,4,9,10,35} Se cambia el 21 por el 40.
{21,4,40,9,10,35} Se cambia el 40 por el 4.
{21,4,9,40,10,35} Se cambia el 9 por el 40.
{21,4,9,10,40,35} Se cambia el 40 por el 10.
{21,4,9,10,35,40} Se cambia el 35 por el 40.
Segunda pasada:
{4,21,9,10,35,40} Se cambia el 21 por el 4.
{4,9,21,10,35,40} Se cambia el 9 por el 21.
{4,9,10,21,35,40} Se cambia el 21 por el 10.
Código:
burbuja([],[]).
burbuja(Xs,Ys):-comparar(Ws,[A,B|Zs],Xs),B<A,
comparar(Ws,[B,A|Zs],Vs),
burbuja(Vs,Ys),!.
burbuja(Xs,Xs).
comparar([],Ys,Ys).
comparar([X|Xs],Ys,[X|Zs]):-comparar(Xs,Ys,Zs).
Consulta:
?-burbuja([10,1,0,4,21,9],B).
B=[0,1,4,9,10,21]
27
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
Código:
Consulta:
?-qsort([1,20,6,5,3,0],Q).
Q = [0,1,3,5,6,20]
T(n)=1 Si n=1
T(n) = T(n/2)+(n)
28
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
T(n) = Q ( n*log(n) )
Código:
mergesort([],[]). % caso base cuando las listas estén vacías.
mergesort([A],[A]). % se introducirá una lista, y arrojara un
resultado con esa misma lista, pero ordenado.
mergesort([A,B|R],S):-partir([A,B|R],L1,L2), %separa cada elemento
de la lista y lo mete en S.
mergesort(L1,S1), %coloca la lista 1 en S1.
mergesort(L2,S2), %coloca la lista 2 en S2.
merge(S1,S2,S). % manda llamar a merge donde hace las
particiones.
partir([],[],[]). % hace las tres particiones.
partir([A],[A],[]). % tiene las dos listas y una vacía donde
pondrá la lista ordenada.
partir([A,B|R],[A|Ra],[B|Rb]):-partir(R,Ra,Rb).
merge(A,[],A). % si la segunda lista es vacía , el resultado sería
los elementos de la lista 1.
merge([],B,B). % si la primera lista es vacía , el resultado sería
los elementos de la lista 2.
merge([A|Ra],[B|Rb],[A|M]):-A =< B,merge(Ra,[B|Rb],M). % compara
un elemento de la lista A si es menor o igual al elemento de la
lista B.
merge([A|Ra],[B|Rb],[B|M]):-A > B,merge([A|Ra],Rb,M). % compara un
elemento de la lista A si es mayor al elemento de la lista B.
Consulta:
?-mergesort([2,5,3,7],R).
R=[2,3,5,7]
29
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
Movimientos (movs):
• tomar el plátano
• subir a la caja
• empujar la caja
• caminar
Código:
mov(estado1,accion,estado2).
mov(edo(centro,sobre_caja,centro,no),toma,
edo(centro,sobre_caja,centro,si)).
mov(edo(X,piso,X,Y),sube,edo(X,sobre_caja,X,Y)).
mov(edo(X,piso,X,Y),empuja(X,Z),edo(Z,piso,Z,Y)).
mov(edo(X,piso,Y,Z),camina(X,W),edo(W,piso,Y,Z)).
come(edo(_,_,_,si)).
come(Edo1) :- mov(Edo1, Acc, Edo2),
come(Edo2).
P2.
Consulta:
?- come(edo(puerta,piso,ventana,no)).
Yes
30
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
?-come(edo(ventana,sobre_caja,centro,si)).
yes
Código:
sol(estado(_,_,_,_,si)).
sol(E1):-trans(E1,Accion,E2),sol(E2).
trans(estado(_,_,_,si,no),comer,estado(_,_,_,si,si)).
trans(estado(y,y,si,no,no),tomar,estado(y,y,si,si,no)).
trans(estado(P1,P1,no,_,_),trepar,estado(P1,P1,si,_,_)).
trans(estado(P1,P1,no,no,_),mover,estado(P2,P2,no,no,_)):-P1=\=P2.
trans(estado(_,P1,no,_,_),caminar,estado(_,P2,no,_,_)):-P1=\=P2.
Código:
%elemento(X,L).
elemento(X,[]):-fail,!.
%la linea anterior se puede borrar para optimizar
elemento(X,[X|R]).
elemento(X,[Y|R]):-elemento(X,R).
%union(P,Q,Z).
union([],Q,Q).
union([X|R],Q,[X|Z]):- \+ elemento(X,Q),!,union(R,Q,Z).
union([X|R],Q,Z):-union(R,Q,Z).
%inters(P,Q,Z).
inters([],Q,[]).
inetrs([X|R],Q,[X|Z]):-elemento(X,Q),!,inters(R,Q,Z).
inters([X|R],Q,Z):-inters(R,Q,Z).
Consulta:
?-union([1,2,3,5],[2,1,6,7],Z).
Z = [3,5,2,1,6,7] ;
31
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
6.3 8 REINAS.
Código:
elemento(X,[X|R]). % Busca el elemento en una lista
elemento(X,[Y|R]):-elemento(X,R).
plantilla([1/S1,2/S2,3/S3,4/S4,5/S5,6/S6,7/S7,8/S8]). % plantilla
de columnas y renglones
solucion([]).% caso base la lista esta vacía
solucion([A/B|R]):-solucion(R),elemento(B,[1,2,3,4,5,6,7,8]),
no_ataca(A/B,R).
no_ataca(_,[]).
no_ataca(X/Y,[A/B|R]):-X=\=A,Y=\=B,
A-X=\=B-Y,
X-A=\=B-Y, % que los renglones y columnas sean diferentes para
que no se coman
no_ataca(X/Y,R). % Busca que no se encuentren en la misma lista o
renglón
Consulta:
?- plantilla(S),solucion(S).
S = [1 / 4,2 / 2,3 / 7,4 / 3,5 / 6,6 / 8,7 / 5,8 / 1] ;
32
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
Código:
% plan(Ciudad1, Ciudad2, hora, dia, variable).
plan(CiudadIni, CiudadFin, Dia, TSal,TLleg,NVuelo):-
vuelo(Dia, CiudadIni, CiudadFin).
vuelo(Dia,CiudadIni,CiudadFin):-tabla(CiudadIni,CiudadFin,Lista),
elemento(LDias,Lista).
elemento(X,[X|R]).
elemento(Y,[X|R]):-elemento(Y,R).
% tabla de vuelos
tabla(tij,cul,[8,10,ticu1,[lu,mi,vi,do]]).
tabla(tij,cul,[14,17,ticu2,[ma,ju,sa]]).
tabla(tij,cul,[19,22,ticu3,[lu,sa,do]]).
tabla(cul,chi,[9,14,tichi1,[lu,ju,sa]]).
tabla(cul,chi,[12,17,tichi2,[lu,mi,sa,do]]).
tabla(chi,df,[18,20,chidf1,[lu,sa]]).
plan(CInic,CFinal,Dia,Hora,[CInic-CFinal/V/TS]):-
tabla(CInic,CFinal,[TS,TLL,V,LDias]),
Hora =< TS, % que la hora deseada sea antes de la hora de
vuelo
elemento(Dia,LDias). %Busca el dia en la lista de días del
vuelo deseado
plan(CInic,CFinal,Dia,Hora,[CInic-E/V/TS|R]):-
tabla(CInic,E,[TS,TLL,V,LDias]),
Hora =< TS,
elemento(Dia,LDias),
plan(E,CFinal,Dia,TLL,R).
Consulta:
?-plan(tij,cul,lu,8,S).
S=[tij - cul / ticu1 / 8] ;
S=[tij - cul / ticu3 / 19] ;
33
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
no
34
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
- write.
Su sintaxis es:
write('Hello world.').
write(X).
- nl.
- write_ln(+Termino)
Equivalente a:
write(+Termino),nl
- writef(+Formato,+Argumentos)
- tab(+X)
- display(+Termino)
Se comporta como “write”, excepto que pasa por alto cualquier declaración de
operadores que se haya hecho.
35
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
- read.
Lee un valor del teclado. La lectura del comando read no finaliza hasta que se
introduce un punto ".". Su sintaxis es:
read(X).
read(ejemplo).
Se evalúa como cierta siempre que lo tecleado coincida con la constante entre
paréntesis (en este caso 'ejemplo').
Código:
lista :- write('cuantos elementos?'), read(N), % lee el numero de
elementos de la lista
leer(N,L),impri_lista(L),nl,asteriscos(L),nl, % lee los
elementos y los imprime con *.
write('Elemento a buscar en la lista :'), % escribe enunciado
read(X), busca(X,L). % lee en elemento a buscar y lo busca el la
lista
impri_lista([]).
impri_lista([A|R]):- write([A]),impri_lista(R). % imprime la lista
leer(0,L).
leer(N,[A|L]):-read(A), Z is N-1,leer(Z,L). %lee los N elementos y
los mete ala lista L
busca(X,[]):-write('No esta !'),nl.
busca(X,[X|R]):-write('Si esta !'),nl. % busca el elemento X en la
lista y te dice si esta
busca(X,[Y|R]):-busca(X,R). % si no esta empieza a buscar el
siguiente
asteriscos([]):-!.
asteriscos([A|R]):- pon(A),nl,asteriscos(R). % saca la lista y la
imprime en asteriscos
pon(0). % no hace nada si detecta un cero
pon(X):-write('*'),Z is X-1,pon(Z). % escribe asteriscos un X un
número de veces
Consulta:
?- lista.
cuantos elementos?|: 6.
|: 1.
|: 2.
|: 3.
|: 4.
36
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
|: 5.
|: 6.
[1][2][3][4][5][6]
*
**
***
****
*****
******
- PROGRAMA CUBO.
Buscar 22_cubo-a.pl y 23_cubo-b.pl en la carpeta de ejemplos.
- Parte a)
Código:
Consulta:
?- cubo(3,C).
C = 27
- Parte b)
Código:
Consulta:
?- cubo.
dime un numero |: 3.
El cubo es 27
dime un numero |: 4.
El cubo es 64
dime un numero |: 5.
El cubo es 125
dime un numero |: 6.
El cubo es 216
dime un numero |: 7.
El cubo es 343
37
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
dime un numero |: 8.
El cubo es 512
dime un numero |: 9.
El cubo es 729
dime un numero |: 10.
El cubo es 1000
El caracter es la unidad más pequeña que se puede leer y escribir. Prolog trata
a los caracteres en forma de enteros correspondientes a su código ASCII.
- put(+Caracter)
- get(-Caracter)
- get0(-Caracter)
- skip(+Caracter)
Existe un archivo predefinido llamado user. Al leer de este archivo se hace que
la información de entrada venga desde el teclado, y al escribir, se hace que los
caracteres aparezcan en la pantalla. Este el modo normal de funcionamiento.
Pero pueden escribirse términos y caracteres sobre archivos utilizando los
mismos predicados que se acaban de ver. La única diferencia es que cuando
queramos escribir o leer en un archivo debemos cambiar el canal de salida
activo o el canal de entrada activo, respectivamente. Posiblemente queramos
leer y escribir sobre archivos almacenados en discos magnéticos. Cada uno de
estos tendrá un nombre del archivo que utilizamos para identificarlo.
38
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
- tell(+NomArchivo)
- telling(?NomArchhivo)
- told
- see(+NomFichero)
- seeing(?NomFichero)
- seen
39
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
Código:
browse(File):-
seeing(User),
see(File),
repeat,
read(Datos),
proceso(Datos),
seen,
see(User),
!.
proceso(end_of_file):- !.
proceso(Datos):-write(Datos),nl,fail.
- OTRAS FUNCIONES:
- En la consola:
Consulta:
?-assert(rojo).
Yes.
Consulta:.
?-rojo.
Yes.
Consulta:.
?- retract(rojo).
Yes.
Consulta:
?-rojo.
No.
40
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
name(?Atomo,?Lista)
Consulta
?- name(abc,L).
L = [97,98,99]
listing
listing(+Predicado)
Todas las cláusulas que tienen como predicado el átomo al que está
instanciada la variable Predicado son mostradas por el fichero de salida activo
(por defecto la pantalla). El predicado de aridad 0 listing (sin parámetro)
muestra todas las cláusulas de la Base de Conocimientos.
clause(?Cabeza,?Cuerpo)
true.
assert(+Clausula)
asserta(+Clausula)
assertz(+Clausula)
41
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
retract(+Clausula)
retractall(+Clausula)
Código:
Consulta:
?- squeeze.
|: Programación lógica practicas de laboratorio 2007.
Programación lógica practicas de laboratorio 2007.
yes
Siempre falla.
- fail
42
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
- true
- repeat
Código:
Consulta:
?-browse('archi2.txt').
padre(juan,maria)
padre(maria,jose)
yes
Código:
escribir:-get0(X),X=\=13,name(T,[X]),write(T),escribir. % permite
capturar el nombre del archivo
escribir:-X=13,put(32),nl,escribir,nl.
grabar(File):-telling(user), % procedimiento que graba el archivo
tell(File), % abrir archivo
escribir,
told, % cerrar archivo
tell(user). % salida del archivo
abrir(File):-seeing(user), % procedimiento que abre un archivo
see(File), % abrir archivo
repeat,
read(Dato), %leer datos del archivo
proceso(Dato),
seen,
see(user), % le la fuente de archivo
!. % detener
proceso(end_of_file):-!. % indica fin del archivo
proceso(Dato):-write(Dato),
put(46),
assert(Dato),
43
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
nl,fail.
Consulta:
?-grabar('color.txt').
|: rojo.
|: azul.
|: Esc
Consulta:
?-abrir ('color.txt').
yes
Consulta:
?-azul.
yes
Código:
44
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
Consulta:
?- escribir('programa.txt').
Escribe:
|: juan.
|: pepe.
|: elisa.
|: pedro.
|: padre(juan,pepe).
|: padre(elisa,pedro).
|: ALTO.
yes
Consulta:
?- leer('programa.txt').
yes
- BLOQUES
Buscar 29_bloques.pl en la carpeta de ejemplos.
Programa que ordena una lista de la forma que se le asigne. Lista inicial es X,
lista final es Y, listas auxiliares son M y N.
B A
C B
A C
B
C
B A
C C
C A B
A A B
A
B
C
B
C C A
A B
A
B
C
Código:
45
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
invertir([],[]).
invertir([X|C],Z) :-invertir(C,C1),
concatenar(C1,[X],Z). %invierte una lista
elimina(X,[X|Cola],Cola):-!. % elimina un elemento X de la lista
elimina(X,[Y|C1],[Y|C2]):-elimina(X,C1,C2).
add(X,L,[X|L]). %agrega un elemento a la lista
primero([X|R],X). % regresa el primer elemento de la lista
elemento(X,[X|R]):-!. % busca si el elemento esta el la lista
elemento(Y,[X|R]):-elemento(Y,R).
elementat(1,[X|R],X):-!.
elementat(N,[X|R],S):-M is N-1,elementat(M,R,S).
elemento2(Y,[X|R],1):-elemento(Y,X),!. %busca un elemento en una
lista de listas
elemento2(Y,[X|R],N):-not(elemento(Y,X)),
elemento2(Y,R,N1),
N is N1+1.
insertar(Y,[X|L],1,Z):-concatenar([Y],X,T),add(T,L,Z),!.
insertar(Y,[X|L],N,[X|T]):-M is N-1,insertar(Y,L,M,T).
insertar2(Y,[X|L],1,Z):-concatenar([Y],[],T),add(T,L,Z),!.
insertar2(Y,[X|L],N,[X|T]):-M is N-1,insertar(Y,L,M,T).
vacio([[]|Ef],0):-!.
vacio([X|Ef],N):-vacio(Ef,N1),N is N1+1.
donde([X|Ef],0,X):-length(X,A),A>0,!.
donde([X|Ef],N,F):-donde(Ef,N1,F),N is N1+1.
mover([[X|T]|R],N,M):-insertar(X,R,N,Y),concatenar([T],Y,M).
numacomp(Ef,I,S):-donde(Ef,S,G),invertir(G,I).
intercambiar(L,N,Q):-elementat(N,L,X),elimina(X,L,H),add(X,H,Q).
solu(Ei,Ef):-write(Ei),nl,nl,numacomp(Ef,Y,N),sol(Ei,Ef,Y,N).
sol(X,X,Y,N):-!. %cuando pones la lista igual de como la quieres
sol([Q|Ei],Ef,[X|Y],N):-not(elemento(X,Q)),
elemento2(X,[Q|Ei],B),
intercambiar([Q|Ei],B,E),
sol(E,Ef,[X|Y],N),
!. % cuando no esta en la primer lista el numero que sigue,
entonces busca el elemento en las demás listas y acomoda al
principio la lista donde encontrara el elemento
sol([[]|Ei],Ef,[X|Y],N):-elemento2(X,[[]|Ei],B),
intercambiar([[]|Ei],B,E),
sol(E,Ef,[X|Y],N),
!. % cuando la primer lista esta vacía, busca el las demás
listas el elemento y acomoda la lista en el principio
sol([Q|Ei],Ef,[Z|Y],N):-primero(Q,X),Z==X,
mover([Q|Ei],N,E),
write(E),
nl,nl,
sol(E,Ef,Y,N),!.
sol([Q|Ei],Ef,Y,N):-vacio([Q|Ei],P),
P=\=N, mover([Q|Ei],P,E),
write(E),
nl,nl,
sol(E,Ef,Y,N),
!.
sol([Q|Ei],Ef,Y,N):-M is N-1,
mover([Q|Ei],M,E),
write(E),
nl,nl,
sol(E,Ef,Y,N). % cuando el elemento esta al final de la
primer lista y ya no hay listas vacías donde poner los elementos
anteriores a el, estos se acomodan en la numero de listas menos 1
penúltima
46
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
Consulta:
?-solu([[f,d,a,b,c],[],[],[],[]],[[],[],[],[],[a,b,c,d,f]]).
[[f,d,a,b,c],[],[],[],[]]
[[d,a,b,c],[],[],[],[f]]
[[a,b,c],[],[],[],[d,f]]
[[b,c],[a],[],[],[d,f]]
[[c],[a],[b],[],[d,f]]
[[],[a],[b],[],[c,d,f]]
[[],[],[a],[],[b,c,d,f]]
[[],[],[],[],[a,b,c,d,f]]
yes
- TORRES DE HANOI
Programa en el que se tiene que mover todos los aros hacia el tercer poste,
usando el segundo como un poste auxiliar. Para calcular los movimientos es
mov=(2^n )-1, donde n es el # de aros
Código:
Consulta:
47
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
?-mover(3,izquierda,derecha,centro).
Mover desde arriba izquierda hacia derecha
Mover desde arriba izquierda hacia centro
Mover desde arriba derecha hacia centro
Mover desde arriba izquierda hacia derecha
Mover desde arriba centro hacia izquierda
Mover desde arriba centro hacia derecha
Mover desde arriba izquierda hacia derecha
yes
Código:
48
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
glpt([M,L1,P1,M],R):-cambia(M,M2),
cambia(M,T2),
P2 = P1,
L2 = L1, % cambia de posición al trigo y al granjero , los demás
permanecen igual
not(peligro(M2,L2,P2,T2)),
not(elemento([M2,L2,P2,T2],R)),
glpt([M2,L2,P2,T2],[[M,L1,P1,M]|R]),
write('Cambia el granjero y el trigo... '),
write(M2),
write(L2),
write(P2),
write(T2),
nl.
glpt([M,L1,P1,T1],R):-cambia(M,M2),
T2 = T1,
P2 = P1,
L2 = L1, % cambia de posición al granjero cada vez cuando vuelve
por los demás
not(peligro(M2,L2,P2,T2)),
not(elemento([M2,L2,P2,T2],R)),
glpt([M2,L2,P2,T2],[[M,L1,P1,T1]|R]),
write('Cambia solo al granjero... '),
write(M2),
write(L2),
write(P2),
write(T2),
nl.
peligro(d,i,i,_). % hay peligro cuando el lobo y el pato están
juntos del lado izquierdo
peligro(i,d,d,_). % hay peligro cuando el lobo y el pato están
juntos del lado derecha
peligro(d,_,i,i). % hay peligro cuando el pato y el trigo están
juntos del lado izquierdo.
peligro(i,_,d,d). % hay peligro cuando el pato y el trigo están
juntos del lado derecho
cambia(d,i). % cambia de posición a los elementos de derecha a
izquierda
cambia(i,d). % cambia de posición a los elementos de izquierda a
derecha.
elemento(X, [X|R]).
elemento(X, [Y|R]):- elemento(X,R). % saca el un elemento de la
lista
Consulta:
?- glpt([i,i,i,i],[]).
Cambia el granjero y el pato... dddd
Cambia solo al granjero... idid
Cambia el granjero y el trigo... ddid
Cambia el granjero y el pato... idii
Cambia el granjero y el lobo... dddi
Cambia solo al granjero... iidi
Cambia el granjero y el pato... didi
yes
NOTA: los resultados salen de abajo hacia arriba, el primer renglón, indica el
estado final de todos, es decir cuando todos llegan al lado derecho a salvo, se
tendría que hacer un proceso para que los resultados los invierta.
49
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
50
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
Tres misioneros y tres caníbales tienen que cruzar un río en una balsa y poder
llegar todos al lado extremo derecho del río, pero si hay mas caníbales que
misioneros en la balsa o en cualquiera de los extremos (izquierdo o derecho)
los caníbales se comerán a los misioneros.
Código:
solucion([[Mnum1,Cnum1,1],[0,0,0]],[[0,0,0],[Mnum1,Cnum1,1]]).
solucion(Iniciopos,Finalpos):-
movimientos(Iniciopos,Finalpos,[Iniciopos],L),
imprimesol(L).
imprimesol([]).
imprimesol([L|T]):-imprimesol(T),
imprimepaso(L),nl.
imprimepaso([[A,B,C],[D,E,F]]):-cambian(A,A1),
cambian(B,B1),
cambian(D,D1),
cambian(E,E1),
write(' Izquierda: '),
write([A1,B1,C]),
write(' Derecha: '),
write([D1,E1,F]).
movimientos(Finalpos,Finalpos,L,L).
movimientos(Desde,Finalpos,Ltemp,L):-mueveuno(Desde,Hasta),
noelemento(Hasta,Ltemp),
movimientos(Hasta,Finalpos,[Hasta|Ltemp],L).
mueveuno([[Ml1,Cl1,1],[Mr1,Cr1,0]],[[Ml2,Cl2,0],[Mr2,Cr2,1]]):-
menos(Arriba,s(s(0))),
menos(s(0),Arriba),
menos(Marriba,s(s(0))),
add(Marriba,Carriba,Arriba),
menos(s(0),Arriba),
add(Ml2,Marriba,Ml1),
add(Mr1,Marriba,Mr2),
add(Cl2,Carriba,Cl1),
add(Cr1,Carriba,Cr2),
permitido([Ml2,Cl2]),
permitido([Mr2,Cr2]).
mueveuno([[Ml1,Cl1,0],[Mr1,Cr1,1]],[L,R]):-
mueveuno([[Mr1,Cr1,1],[Ml1,Cl1,0]],[R,L]).
permitido([0,_]).
permitido([s(M),C]):-menos(C,s(M)).
add(0,X,X).
add(s(X),Y,s(Z)):-add(X,Y,Z).
menos(0,_).
menos(s(X),s(Y)):-menos(X,Y).
51
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
cambian(0,0).
cambian(s(X),N):- cambian(X,N1), N is N1+1.
cambiap(0,0).
cambiap(N,s(X)):-N=\=0, N1 is N-1, cambiap(N1,X).
noelemento(_,[]).
noelemento(A,[H|T]):- A \== H,
noelemento(A,T).
Consulta:
?- miscan.
Numero de canibales: |: 3.
Numero de misioneros:|: 3.
Solucion:
52
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
8.1 COMANDOS.
Strawberry Prolog contiene una gran cantidad de funciones que nos permite
hacer uso del modo grafico. A continuación se listan las principales funciones:
- MENU.
- CHECKBOX.
- EDIT.
53
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
- DIBUJO.
- FUENTES,COLORES,LAPIZ Y BACKGROUNDS.
FUNCION WINDOW( ).
Sintaxis:
Ejemplo:
?-window(_,_,win_func(_),"Ejemplo",100,100,200,200).
win_func(paint):-line(0,0,200,200),line(0,200,200,0).
FUNCION EDIT( ).
Sintaxis:
54
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
EJEMPLO:
FUNCION BUTTON( ).
Sintaxis:
Ejemplo:
?-window(_,_, win_func(_),"Button demo",100,100,200,200).
win_func(init):-button(_,_,bfunc(_),"button",10,10,50,50).
bfunc(press):-message("Message", "Button pressed.", i).
Sintaxis:
Ejemplo:
R is get_check_box_value(Check_Box)
set_check_box_value(Check_Box,Value)
FUNCION RADIO_BUTTON( ).
Sintaxis:
Ejemplo:
R is get_check_box_value(Radio_Button)
set_check_box_value(Radio_Button,Value)
FUNCION STATIC( ).
Sintaxis:
Ejemplo:
55
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
FUNCION BITMAP( ).
Sintaxis:
Ejemplo:
FUNCION ICON( ).
Sintaxis:
Ejemplo:
FUNCION ANIMATE ( ).
Sintaxis:
animate(Handle,Parent,Icon_func(_),AVIfile,X,Y)
Ejemplo:
?-window(_,_,win_func(_),"Animation controldemo",100,100,200,200).
win_func(init):-animate(_,_,fail(_),"res/Dillo.avi",50,50).
Sintaxis:
list_box(Handle,Parent,List_func,Lable,X,Y,Width,Height)
Ejemplo:
?-window(_,_,win_func(_),"List Demo",100,50,370,420).
win_func(init):-
list_box(G_List_Box,_,list_func,"Name",10,10,150,350),
change_style(G_List_Box,0,0,0x200),
insert_list_item(G_List_Box,end,"First",_).
list_func(edit(Item,Text)):-
yes_no("List Demo","Are you sure that you want to change this
56
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
text.",?),
set_list_label(G_List_Box,Item,0,Text).
FUNCION TREE_BOX( ).
Sintaxis:
tree_box(Handle,Parent,Tree_func,_,X,Y,Width,Height)
Ejemplo:
?-window(_,_,win_func(_),"Tree Demo",100,50,370,420).
win_func(init):-
tree_box(G_Tree_Box,_,tree_func,_,10,10,150,350),
change_style(G_Tree_Box,0,0,8),
insert_tree_item(G_Tree_Box,_,root,first,"First",_,_).
tree_func(edit(Item,Text)):-
yes_no("Tree Demo","Are you sure that you want to change this
text.",?),
set_tree_item(G_Tree_Box,Item,Text,_,_).
FUNCIONGET_TEXT().
Sintaxis:
get_text(Window)
Ejemplo:
?-window(_,_,win_func(_),"set_text/get_textdemo",100,100,300,200).
win_func(init):-menu(normal,_,_,mfunc(_),"Change text").
mfunc(press):-set_text("New Text",_).
FUNCION ENABLE_WINDOW( ).
Sintaxis:
enable_window(Window,Mode)
Ejemplo:
?-window(Win,_,win_func(_),"Enable Demo",100,100,300,200),
enable_window(Win,0).
FUNCIONMENU().
Sintaxis:
menu(Type,Handle,Parent,Menu_func(_),Text)
Ejemplo:
?-window(_,_,win_func(_),"menu demo",100,100,200,200).
57
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
win_func(init):-
menu(pop_up,_,_,mpopup(_),"Pop_up"),
menu(normal,_,_,mitem(_),"MenuItem").
mitem(press):-message("Message","menu Item selected",i).
mpopup(init):-
menu(normal,_,_,s1(_),"SubItem1"),
menu(separator,_,_,fail(_),_),
menu(normal,_,_,s2(_),"SubItem2").
s1(press):-message("Message","Sub Item 1 selected",!).
s2(press):-message("Message","Sub Item 2 selected",n).
FUNCION ADD_TEXT( ).
Sintaxis:
add_text(Edit,Text)
Ejemplo:
?-...,
Redisfont_mask(_,rgb(255,0,0),_,_,_,_,_,_),
add_text(Edit,"Added Text",Red).
FUNCIONGET_SELECTED_TEXT().
Sintaxis:
get_selected_text(Edit)
Ejemplo:
?-...,
set_selection(Edit,10,35),
Textisget_selected_text(Edit),
write(Text).
FUNCION LINE( ).
Sintaxis:
line(X1,Y1,X2,Y2,...,Xn,Yn)
Ejemplo:
?-window(_,_,win_func(_),"Line demo",100,100,300,300).
win_func(paint):-
pen(2,rgb(255,0,0)),
brush(rgb(0,0,255)),
fill_polygon(0,0,200,200,0,100+100),
line(0,0,200,0,200,100+100).
FUNCION ELLIPSE( ).
Sintaxis:
58
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
rect(X1,Y1,X2,Y2)
Ejemplo:
?-window(_,_,win_func(_),"Ellipse demo",100,100,200,200).
win_func(paint):-ellipse(0,0,200,200).
FUNCION RECT( ).
Sintaxis:
rect(X1,Y1,X2,Y2)
Ejemplo:
?-window(_,_,win_func(_),"Rectangle demo",100,100,200,200).
win_func(paint):-
rect(50,50,150,150),round_rect(70,70,130,130,10,10).
FUNCION BITMAP_IMAGE( ).
Sintaxis:
bitmap_image(Source,_)
Ejemplo:
?-...,
Bitmapisbitmap_image("image.bmp",_),
draw_bitmap(10,10,Bitmap,_,_).
FUNCION PEN( ).
Sintaxis:
pen(PenWidth,Color)
Ejemplo:
?-window(_,_,win_func(_),"Pen Demo",100,100,200,200).
win_func(paint):-
pen(1,rgb(255,0,0)),line(0,0,200,200),
pen(5,rgb(0,0,255)),line(0,200,200,0).
FUNCION BRUSH( ).
Sintaxis:
brush(Color,Type)
Ejemplo:
?-window(_,_,win_func(_),"Brush Demo",100,100,200,200).
59
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
win_func(paint):-
brush(rgb(255,0,0)),rect(0,50,200,150),
brush(rgb(0,0,255)),rect(50,0,150,200).
FUNCION COLOR_TEXT( ).
Sintaxis:
color_text(Window,Color)
Ejemplo:
?-window(_,_,win_func(_),"Edit control demo",100,100,200,200).
win_func(init):-
window_brush(_,rgb(0,0,255)),%blue
edit(E1,_,edit_func(_),"StartValue",10,10,100,50).
edit_func(init):-
color_text(_,rgb(0,255,0)),%green
color_text_back(_,rgb(255,0,0)).%red
60
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
VENTAJAS DE PROLOG
Prolog, y en general los lenguajes de programación lógica, tienen las siguientes
ventajas frente a los lenguajes clásicos (procedimentales):
61
UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA
Programación Lógica + Manual de laboratorio + Dr. Antonio Rodríguez Díaz
REFERENCIAS.
Tutorial:
http://www.csupomona.edu/~jrfisher/www/prolog_tutorial/contents.html
Swin-Prolog:
http://www.swi-prolog.org/
Strawberry Prolog:
http://www.dobrev.com/
Programación lógica:
http://www.geocities.com/v.iniestra/apuntes/pro_log/
Programing in Prolog:
http://cwis.kub.nl/~fdl/general/people/rmuskens/courses/prolog/
Ingenieros en infomatica.og:
http://ingenieroseninformatica.org/recursos/tutoriales/sist_exp/cap5.php
62