0% encontró este documento útil (0 votos)
63 vistas33 páginas

Secciones de un Programa en Visual Prolog

El documento describe las diferentes secciones que componen un programa en Visual Prolog, incluyendo directivas de compilación, secciones de constantes, dominios, base de datos, predicados, cláusulas y meta. También explica el entorno de desarrollo de Visual Prolog y los tipos de ventanas que incluye.

Cargado por

Juan Tarazona
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOC, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
63 vistas33 páginas

Secciones de un Programa en Visual Prolog

El documento describe las diferentes secciones que componen un programa en Visual Prolog, incluyendo directivas de compilación, secciones de constantes, dominios, base de datos, predicados, cláusulas y meta. También explica el entorno de desarrollo de Visual Prolog y los tipos de ventanas que incluye.

Cargado por

Juan Tarazona
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOC, PDF, TXT o lee en línea desde Scribd

ISUAL PROLOG

Entorno de desarrollo

1 Secciones de un programa en Visual Prolog


1.1 Directivas de compilacin
1.2 Seccin de constantes
1.3 Seccin de dominios
1.3.1 Dominios de Objetos Compuestos
1.3.2 Dominios de Objetos Compuestos Functorless
1.3.3 Sinnimos de Dominios Estndar
1.3.4 Dominios tipo Lista
1.3.5 Dominios tipo Predicado
1.4 Seccin de la base de datos
1.4.1 Predicados definidos en Visual Prolog para
manejar la base de datos
1.5 Seccin de definicin de predicados
1.5.1 Tipos de predicados
1.5.2 Ejemplos de cmo conseguir la coherencia entre
reglas y predicados en el aspecto determinista
1.6 Seccin de clusulas
1.7 Seccin de meta u objetivo
1.8 Ejemplo
2 El entorno de desarrollo de Visual Prolog
2.1 Aplicaciones orientadas a eventos
2.2 Aplicaciones orientadas a eventos en Visual Prolog

2.2.1 Tipos de ventanas en Visual Prolog


2.2.2 El dilogo Experto del entorno de desarrollo VPI
2.2.3 El primer programa VPI

Secciones de un programa en Visual Prolog


Un programa en Visual Prolog est compuesto de varias secciones que se
describen a continuacin:

Directivas de compilacin: que se dan al comienzo del programa.


Seccin de constantes: puede contener cero, una o varias constantes.
Seccin de dominios: puede contener cero, uno o varios dominios.
Seccin de la base de datos: puede contener cero, uno o varios
predicados de la base de datos.
Seccin de predicados: puede contener cero, una o varias declaraciones
de predicados.
Seccin de clusulas: puede contener cero, una o varias clusulas.
Seccin de meta: para que el programa se ejecute de forma
independiente debe existir una meta construida dentro del propio
programa.

[NDICE]

Directivas de compilacin
Nos permiten controlar las caractersticas del compilador. Estas directivas
pueden ser cambiadas a travs del men, mediante opciones de lnea de
comando y en el propio cdigo fuente. En caso de activar una misma directiva
de forma distinta en el entorno y en el cdigo fuente, prevalece la activacin
realizada en el cdigo fuente. Ver Tabla 1
Directiva

bgidriver

bgifont

Significado
Esta directiva se utiliza de un modo similar a este ejemplo: bgidriver
"_CGA_driver_far", para establecer el tipo de controlador de grficos que se
debe linkar con un programa MS-DOS de grficos BGI.
Esta directiva se utiliza de un modo similar a este ejemplo: bgifont
"_gothic_font_far", para establecer el tipo de fuente de texto que se debe utilizar
con el programa a la hora de escribir un programa para MS-DOS basado en

grficos BGI.
Esta directiva activa la deteccin de clusulas no deterministas. Si
especificamos esta directiva, Visual Prolog dar un warning cada vez que se
detecte un predicado de tipo no determinista. Hay dos tipos de clusulas no
deterministas:
check_determ

Aquellas que no poseen corte y hay una o ms clusulas que pueden


casar con los mismos argumentos de entrada para un patrn de flujo.

Aquellas que llaman a otras no deterministas y el predicado llamado no


est seguido de un corte.

code

Especifica el tamao del array interno de cdigo. Por defecto son 2000 prrafos
(unidades de 16 bits), para la versin VP de 16 bits. En otro caso, son 10000.
Por ejemplo si escribimos code=1024 tenemos un array de cdigo de 16 * 1024
bytes=16Kbytes de tamao.

config

Permite definir el aspecto de los programas en modo texto en MS-DOS antiguo.

diagnostics

Permite observar los un conjunto de parmetros de un programa Prolog.

error

Produce mensajes de error en tiempo de compilacin. Cuando se encuentra un


error de este tipo al llegar a la lnea de la directiva, se visualiza en pantalla el
mensaje escrito al lado de #error. Es muy til para encontrar inconsistencias
debidas al programador y violacin de restricciones impuestas.

errorlevel

Permite establecer el grado de detalle con que VP informa de los errores al


programador. Puede ser 0, 1 2.

heap

Sirve para especificar la cantidad de memoria que se reservar para un


ejecutable TSR en MS-DOS.

gstacksize

Se debe escribir en la seccin MAIN para que sea tenida en cuenta y permite
establecer el nmero de bytes de la pila global (cantidad de memoria virtual que
el sistema operativo debe reservar), mientras el programa est cargado.

nobreak

En ausencia de esta directiva cada vez que se realice una llamada a un


predicado, se examinar el teclado para ver si se ha pulsado ctrl-break, por lo
que se ralentiza la ejecucin de la aplicacin y, adems, ocupa un pequeo
espacio de programa. El uso de la directiva evita que se genere este cdigo
examinador. Cuando se utiliza esta directiva, la nica forma de salir de un bucle
infinito es mediante un proceso de reset.

nowarnings

Suprime los avisos generados por la existencia de una variable una sola vez en
una clusula. Estas variables pueden ser sustituidas por variables annimas,
luego, en principio, no deben aparecer en un programa bien escrito.

printermenu

Permite la generacin de cdigo en programas MS-DOS que facilita la


impresin de pantallas en modo texto, mediante la pulsacin del conjunto Alt-p

Se usa cuando utilizamos una metodologa de diseo e implementacin


modular. Permite especificar a qu proyecto pertenece un mdulo determinado.

project

Tabla 1
[NDICE]

Seccin de constantes
En la seccin de constantes podemos declarar constantes simblicas que
pueden usarse en el cuerpo del programa. La utilidad de las constantes en
Visual Prolog es similar a la que estos elementos tienen en otros lenguajes de
programacin, normalmente, sirven para facilitar el uso de diversas
cantidades, expresiones y smbolos.
La definicin de la seccin de constantes se encabeza con la palabra
reservada CONSTANTS, y cada lnea de definicin es de la forma <Nombre
Constante> = <Definicin de Macro>.
Por ejemplo, el siguiente fragmento de programa visualiza en pantalla el
contenido:
12
A=1, B=2
1 Solution
CONSTANTS
numero=1
expresion=1+1
GOAL
A=numero,B=expresion,write(A),write(B),nl.

Las restricciones que se imponen en el uso de constantes se exponen a


continuacin:

El sistema no distingue entre maysculas y minsculas.


La definicin de una constante no puede referirse a s misma, es decir,
no es posible construir definiciones recursivas de constantes.
Puede haber varias secciones CONSTANTS a lo largo del programa, y
toda constante debe ser definida antes de ser utilizada.
Las constantes declaradas son efectivas desde el punto en que son
declaradas hasta el final del fichero fuente donde han sido definidas y
en algunos ficheros incluidos tras la declaracin.

Las constantes slo se pueden declarar una vez.

[NDICE]

Seccin de dominios
En la seccin DOMAINS se pueden definir dominios no especificados por
defecto por Visual Prolog. Por ejemplo, el dominio integer es estndar para el
compilador, no as el dominio sinnimo ENTERO o dominios complejos. En
estos ltimos casos, el programador debe definirlo en esta seccin.
Cada seccin de dominios debe comenzar con la palabra DOMAINS. Ejemplo:
DOMAINS
ENTERO=INTEGER

Es posible usar 5 formatos de declaraciones para dominios definidos por el


usuario.
[NDICE]

Dominios de Objetos Compuestos


El formato es como sigue:
dominio = [reference] [align {byte|word|dword}] declaracion1;
[declaracion2];...

dominio: nombre dado al dominio especificado por el usuario.


declaracion1; [declaracion2]: declaracin de objetos compuestos
alternativos que tienen que tener la forma siguiente: functor([sub_1 [,
sub_2, ...] ])donde
o functor es el nombre del objeto compuesto alternativo.
o sub_1 [,sub_2, ...] son subcomponentes del objeto compuesto
que deben tener su correspondiente nombre y dominio. Este
ltimo puede ser estndar o definido por el usuario.
reference: indica la declaracin de un dominio de referencia. En este
tipo de dominios los argumentos de entrada pueden ser variables libres.
align: indica el tipo de distribucin de memoria que se va a usar.

Ejemplo:
DOMAINS
LECTOR=lee(SYMBOLNombre,LECTURAItem)
LECTURA=libro(SYMBOLAutor,SYMBOLTitulo,SYMBOLEditorial);

revista(SYMBOLTitulo,INTEGERNumero)

Los nombres colocados al lado de cada dominio en los subcomponentes de la


definicin de los dominios del ejemplo son opcionales y pueden omitirse, ya
que slo sirven para aumentar la legibilidad del programa.
El smbolo ";" indica que el dominio LECTURA puede referirse tanto
a libros como a revistas, es decir, tanto los objetos libros como los
objetos revistaspertenecen al dominio LECTURA.
El siguiente programa lista lo que cada lector lee en las
variables X e Y respectivamente.
DOMAINS
LECTOR=lee(SYMBOLNombre,LECTURAItem)
LECTURA=libro(SYMBOLAutor,SYMBOLTitulo,SYMBOLEditorial);
revista(SYMBOLTitulo,INTEGERNumero)
PREDICATES
lectores(LECTOR)
CLAUSES
lectores(lee(antonio,libro(cervantes,quijote,anaya))).
lectores(lee(pepe,revista(hola,22))).
lectores(lee(juan,libro(delphi4,alvarez,anaya))).
GOAL
lectores(lee(X,Y)).

El resultado obtenido tras la ejecucin del objetivo propuesto en la seccin de


metas es:
X=antonio, Y=libro("cervantes","quijote","anaya")
X=pepe, Y=revista("hola",22)
X=juan, Y=libro("delphi4","alvarez","anaya")
3 Solutions

Dominios de Objetos Compuestos Functorless


En estos dominios podemos definir tipos de objetos que slo se pueden
comportar como una nica clase de objetos. Mientras que en el caso anterior
un determinado dominio poda definir un objeto u otro, en el caso de dominios

de objetos Functorless dicho dominio slo puede definir un objeto compuesto.


La sintaxis de este tipo de dominios es similar a la anterior salvo porque es
necesario especificar la palabra struct y no puede haber ms de una definicin
de objeto por dominio.
dominio = struct [align {byte|word|dword}] declaracion
Con este tipo de declaracin los objetos utilizado mantienen una sintaxis muy
parecida a la de C.
Ejemplo:
DOMAINS
ESCULT=structescultura(INTEGERns,SYMBOLautor,SYMBOLmaterial)
PINTURA=structcuadro(INTEGERns,SYMBOLautor,SYMBOLtecnica)

[NDICE]

Sinnimos de Dominios Estndar


En ocasiones, puede ser til definir sinnimos de dominios que son estndar,
para una mayor legibilidad del programa, por ejemplo. As pues en la
siguiente declaracin:
DOMAINS
ENTERO=integer
ESCULT=structescultura(ENTEROns,SYMBOLautor,SYMBOLmaterial)
PINTURA=structcuadro(ENTEROns,SYMBOLautor,SYMBOLtecnica)

ENTERO no es ms que un sinnimo de integer que puede ser usado del


mismo modo que este ltimo.
[NDICE]

Dominios tipo Lista


Las listas son estructuras comunes de datos en Prolog consideradas como una
forma de objeto compuesto. Son secuencias de elementos generalmente
homogneos. Sin embargo, en Visual Prolog es fcil crear listas heterogneas
mediante el uso eficaz de declaracin de dominios.
La sintaxis para crear una lista de objetos es del modo:
dominiolista = dominiocomponentes*

Si dominiocomponentes define varios objetos distintos, la lista definida ser


heterognea o polimrfica.
Veamos varios ejemplo de listas homogneas:
DOMAINS
listaenteros=integer*/*Listadeenteros*/
listacaracteres=char*/*Listadecaracteres*/
listacuadros=cuadro*/*Listadeestructurasdeldominiocuadro*/

Veamos ahora un ejemplo de lista polimrfica que puede almacenar tanto


estructuras tipo cuadro como estructuras tipo escultura:
DOMAINS
objetos=escultura(ENTEROns,SYMBOLautor,SYMBOLmaterial);
cuadro(ENTEROns,SYMBOLautor,SYMBOLtecnica)
/*Losobjetospuedenseresculturasocuadros*/
listapolim=objetos*/*Estoesunalistadeobjetos*/

[NDICE]

Dominios tipo Predicado


Un dominio predicado (dominio puntero a predicado), permite la declaracin
de un grupo o una clase de predicados. La sintaxis es como sigue:
PredicadoDom = TipoPredicado [Retorno] (ListaArg) [- [[TipoPredicado]
patron]] [lenguaje]
donde:

PredicadoDom es el nombre del dominio.


TipoPredicado es de la forma {procedure | determ | nondeterm | failure |
erroneous | multi}, estos son los tipos de predicados que pueden existir.
Retorno es el dominio al que pertenecen los datos de retorno cuando el
predicado es una funcin.
ListaArg es la lista de argumentos del predicado que son objetos con
sus correspondientes dominios.
patron (de flujo) define como se van a usar los argumentos, si son de
entrada (i), o de salida (o), o de entrada-salida (i|o).
lenguaje define el tipo de lenguaje que ha sido usado para definir un
tipo de predicado. Puede ser: language{ asm | c | pascal | prolog |
stdcall | syscall }.

Ejemplo:
DOMAINS
par=pares(INTEGER,INTEGER)
listapares=par*
listaenteros=integer*
unaria=determINTEGER(INTEGER)(i)
PREDICATES
predicadosuma(par,INTEGER)
cubo:unaria
cuadrado:unaria
operacion(listapares,unaria,listaenteros)
CLAUSES
cubo(E,ECubo):ECubo=E*E*E.
cuadrado(E,ECuadrado):ECuadrado=E*E.
predicadosuma(pares(E1,E2),Suma):Suma=E1+E2.
/**/
operacion([],_,[]).
operacion([X|Y],OperacionUnaria,LRes):predicadosuma(X,S),
Res=OperacionUnaria(S),
operacion(Y,OperacionUnaria,Aux),
LRes=[Res|LAux].
GOAL
operacion([pares(3,2),
pares(2,1),pares(3,4)],cuadrado,ListaCuadrados),
operacion([pares(3,2),
pares(2,1),pares(3,4)],cubo,ListaCubos).

Vamos a explicar detalladamente cmo funciona el ejemplo propuesto para


ilustrar el uso de la seccin DOMAINS.
El predicado principal se denomina operacion y admite como argumentos una
lista de predicados del dominio listapares, un predicado del
dominioOperacionUnaria y una lista de enteros. Es interesante notar que en

Visual Prolog podemos pasar como argumentos de nuestros predicados, no


slo datos y objetos compuestos sino tambin predicados y funciones que
realizan diversas operaciones. De este modo, el predicado operacion recorre
cada par de la lista, suma los nmeros que componen dicho par y les aplica el
predicado (operacin unaria), pasado por parmetro, as el mismo
predicado operacion sirve para calcular cuadrados, cubos, etc., sobre la suma
de los pares de la lista original.
Como vemos unaria = determ INTEGER (INTEGER) - (i) es la definicin de
un dominio al que pertenecen todos los predicados que tengan esa forma.
Cualquier predicado que realiza una operacin unaria de este tipo encaja en
ese dominio. As pues en el ejemplo tenemos definidos los
predicados cuadrado y cubo como del dominio unaria.
En la seccin CLAUSES se define exactamente el cuerpo de ambos predicados
que este caso actan como funciones.
Para la meta especificada, el resultado de la ejecucin es el siguiente:
ListaCuadrados=[25,9,49], ListaCubos=[125,27,343]
1 Solution
[NDICE]

Seccin de la base de datos


Como sabemos un programa en Visual Prolog no es ms que un conjunto de
hechos y reglas. En ocasiones, podemos querer actualizar este conjunto de
hechos mientras el programa se ejecuta. En tal caso, los hechos deben tratarse
como un conjunto dinmico de datos que pertenecen a una base que puede ser
actualizada y modificada convenientemente mientras dura la ejecucin del
programa.
Slo los hechos que se declaran en la seccin FACTS sern dinmicos y
podrn ser actualizados en tiempo de ejecucin.
La seccin FACTS (tambin llamada DATABASE) tiene la siguiente forma:
[GLOBAL] {FACTS | DATABASE} [- nombre de la base de datos]
[nocopy][{nondeterm|determ|single}] hecho_1[([Lista_Args_hecho_1])]
...
[nocopy][{single|determ|nondeterm}] hecho_N[([Lista_Args_hecho_N])]

...
donde:

GLOBAL: determina si esta seccin es o no de mbito global a todo el


proyecto.
nocopy: determina que los datos que se van a enlazar o unificar con una
variable al hacer una llamada al hecho no se almacenarn
temporalmente en la pila global del programa.
nodeterm: determina que pueden existir varias instancias para el hecho.
determ: determina que slo puede existir una instancia para el hecho en
el mismo momento.
single: determina que slo puede existir una y slo una instancia para el
hecho.

[NDICE]

Predicados definidos en Visual Prolog para manejar la base de


datos

assert(<Dominio del hecho> Hecho) - (i): Inserta un hecho tras otros


encontrados pertenecientes al mismo predicado en la base de hechos. Si
se trata de un hecho single lo sustituye. Este predicado nunca falla.
assert(<De correspondientes dominios del hecho> Hecho,
NombreSeccionHechos) - (i,i): Inserta un hecho tras otros encontrados
pertenecientes al mismo predicado en la base de hechos con el nombre
especificado en NombreSeccionHechos. El hecho debe ser un trmino
perteneciente al dominio de la seccin de hechos dados
en NombreSeccionHechos. Este predicado nunca falla.
asserta(<Dominio del hecho> Hecho) - (i): ): Inserta un hecho delante
de otros encontrados pertenecientes al mismo predicado en la base de
hechos. Este predicado nunca falla.
asserta(<De correspondientes dominios del hecho> Hecho,
NombreSeccionHechos) - (i,i): Inserta un hecho delante de otros
encontrados pertenecientes al mismo predicado en la base de hechos
con el nombre especificado en NombreSeccionHechos. El hecho debe
ser un trmino perteneciente al dominio de la seccin de hechos dados
en NombreSeccionHechos. Este predicado nunca falla.
assertz(<Dominio del hecho> Hecho) - (i): Como assert/1. Este
predicado nunca falla.
assertz(<De correspondientes dominios del hecho> Hecho,
NombreSeccionHechos) - (i,i): Como assert/2. Este predicado nunca
falla.

consult(STRING OSNombreFichero) - (i): Sirve para leer hechos desde


un fichero de hechos y almacenarlos en la base de hechos. Este fichero
debe haber sido salvado con save.
consult(STRING OSNombreFichero, NombreSeccionHechos) - (i,i):
Sirve para leer hechos desde un fichero de hechos y almacenarlos en la
base de hechos de nombre NombreSeccionHechos. Este fichero debe
haber sido salvado con save.
save(STRING OSNombreFichero) - (i): Sirve para salvar los hechos de
la seccin de hechos sin nombre en un fichero de texto.
save(STRING OSNombreFichero, NombreSeccionHechos) - (i,i): Sirve
para salvar los hechos de una seccin de hechos con
nombreNombreSeccionHechos en un fichero de texto.
nondeterm retract(<Dominio del hecho> Hecho): Borra el primer
hecho que encuentre que case con el hecho especificado en el
argumento. Falla cuando no hay ms hechos que borrar.
nondeterm retract(<De correspondientes dominios del hecho> Hecho,
NombreSeccionHechos) - (i,i): Borra el primer hecho que encuentre que
case con el hecho especificado en el argumento. Acta sobre del
dominio de hechos con nombre NombreSeccionHechos. Falla cuando
no hay ms hechos que borrar.
determ retractall(<Dominio del hecho> Hecho) - (i): Borra el todos los
hechos encontrados que casen con el hecho especificado en el
argumento. Nunca falla.
determ retractall(<De correspondientes dominios del hecho> Hecho,
NombreSeccionHechos ) - (i,i): Borra todos los hechos encontrados que
casen con el hecho especificado en el argumento. Acta sobre del
dominio de hechos con nombre NombreSeccionHechos.

Veamos ahora algunos ejemplos de uso de los predicados mostrados para


manejar la base de hechos.
FACTS
padre(string,string)
PREDICATES
abuelo(string,string)
CLAUSES
padre(juan,pepe).
padre(juan,luis).
padre(pepe,manolo).
abuelo(X,Y):padre(X,Z),padre(Z,Y).
GOAL

assert(padre(pepe,beatriz)),
assertz(padre(pepe,carlos)),
asserta(padre(pepe,maria)),
abuelo(juan,Y).

Tenemos 3 hechos que definen quin es padre de quin y un predicado para


deducir el parentesco abuelo.
Tras la ejecucin de la meta obtenemos el siguiente resultado:
Y=maria
Y=manolo
Y=beatriz
Y=carlos
4 Solutions

Si examinamos paso a paso esta ejecucin, lo que ha sucedido ha sido lo


siguiente:

Tras el primer assert hemos insertado el hecho padre(pepe,


beatriz) tras padre(pepe, manolo).
El predicado assertz funciona como assert, luego hemos insertado el
hecho padre(pepe, carlos) tras el hecho padre(pepe, beatriz).
Por ltimo asserta inserta al principio, luego el hecho padre(pepe,
maria) ha quedado colocado el primero.

Veamos ahora un ejemplo del uso de retract y retractall.


FACTS
padre(string,string)
PREDICATES
abuelo(string,string)
CLAUSES
padre(juan,pepe).
padre(juan,luis).
padre(pepe,manolo).
padre(pepe,beatriz).
padre(pepe,carlos).

padre(pepe,maria).
abuelo(X,Y):padre(X,Z),padre(Z,Y).
GOAL
retract(padre(pepe,_)),!,
padre(pepe,L).

En este caso retract borra todas la primera ocurrencia de padre, siempre que
su primer argumento sea pepe.
El corte que va despus de retract sirve para que Visual Prolog no haga
backtracking y borre todas las ocurrencias de padre(pepe, ...), ya que por
defecto el compilador intenta ofrecer todas las posibles soluciones para una
meta dada. Con el corte situado en ese lugar, slo se hace bactracking
sobre padre(pepe, L).
El resultado de la ejecucin se muestra a continuacin:
L=beatriz
L=carlos
L=maria

En el ejemplo siguiente, vemos que en lugar de usar retract estamos


usando retractall para borrar todas las ocurrencias de padre(pepe, ...).
FACTS
padre(string,string)
PREDICATES
abuelo(string,string)
CLAUSES
padre(juan,pepe).
padre(juan,luis).
padre(pepe,manolo).
padre(pepe,beatriz).
padre(pepe,carlos).
padre(pepe,maria).
abuelo(X,Y):padre(X,Z),padre(Z,Y).
GOAL

retractall(padre(pepe,_)),
padre(pepe,L).

El resultado de esta ejecucin es:


No Solution

[NDICE]

Seccin de definicin de predicados


En esta seccin se definen los predicados que pueden pertenecer a dominios
definidos en la seccin DOMAINS (punteros a predicados), o se definen los
predicados con una forma determinada en caso de que no los hayamos
agrupado en ningn dominio concreto (todas las reglas de la seccin de
clusulas deben pertenecer a algn predicado). La seccin de definicin de
predicados va precedida siempre de la palabra PREDICATES.
Por ejemplo podemos tener este caso:
DOMAINS
unaria=determINTEGER(INTEGER)(i)
PREDICATES
cubo:unaria
CLAUSES
cubo(E,Res):Res=E*E*E.

O podemos tener este otro:


PREDICATES
cubo(INTEGER,INTEGER)
CLAUSES
cubo(E,Res):Res=E*E*E.

En el primer caso cubo se define como una funcin y debe ser llamada
como A=cubo(3) y en el segundo caso la llamada debe hacerse como cubo(3,
A).
Ambas formas de definicin son igualmente correctas y su uso depender de
la aplicacin en cuestin en la que estemos trabajando.

Punteros a predicados: su forma general es como sigue: Nombre:


Dominio del predicado [namespec] donde:

Nombre: es el nombre del puntero a predicado.


o Dominio del predicado: es el dominio al que pertenece el
predicado y debe declararse en la seccin DOMAINS.
o [namespec]: puede ser usado para especificar el nombre de un
cdigo objeto pblico en una declaracin global. Su principal
uso se da cuando se linkan mdulos escritos en otros lenguajes.
Predicados y funciones: su forma general es como
sigue: [TipoPredicado] [DominioRetorno]
NombrePredicado[(ListaArgumentos)] [- [flowpatterns]] [lenguaje]
[namespec] donde:
o [TipoPredicado]: es de la forma {procedure | determ |
nondeterm | failure | erroneous | multi}. Pueden declararse varios
junto con los distintosflowpatterns seleccionados para el
predicado.
o [DominioRetorno]: es el dominio de retorno si se est
declarando una funcin.
o NombrePredicado: es el nombre del predicado.
o [(ListaArgumentos)]: es la lista de argumentos del predicado.
o [- [flowpatterns]]: los patrones de flujo indican como se usa
cada argumento de la lista de argumentos. Utilizaremos i para los
argumentos de entrada y o para los argumentos de salida. Pueden
declararse varios para un mismo predicado.
o [lenguaje]: es de la forma language { asm | c | pascal | prolog |
stdcall | syscall }.
o [namespec]: es usado como en el caso de punteros a predicados.
o

[NDICE]

Tipos de predicados
Como hemos visto, pueden existir 6 tipos de predicados en funcin de cmo y
cuantas soluciones pueden aportar y si pueden o no fallar. Cada predicado
puede tener varias clusulas o reglas que lo implementa, por tanto, clusulas y
predicados deben ser coherentes.
Esta coherencia est relacionada con el concepto de determinismo en Visual
Prolog.
La mayora de los lenguajes son deterministas. Esto quiere decir que cualquier
conjunto de datos de entrada conduce a un nico conjunto de instrucciones
para producir un conjunto de datos de salida. Sin embargo, en Visual Prolog se
admite la inferencia no determinista basada en predicados no deterministas.
Visual Prolog ejerce un gran control sobre el determinismo de las reglas y
predicados que aparecen en los programas, principalmente con el objeto de

ahorrar espacio de almacenamiento en tiempo de ejecucin. Cuando una


clusula o regla determinista que compone un predicado termina con xito, el
espacio de pila correspondiente puede ser dispensado rpidamente, liberando
de este modo el espacio ocupado.
El sistema de control del determinismo de Visual Prolog es muy fuerte. De
hecho, el compilador fuerza al programador, a travs de este control, a
declarar en sus predicados 2 aspectos de comportamiento importantes:

Si la llamada a un predicado puede fallar.


Nmero de soluciones que un predicado puede producir.

De acuerdo a estos dos aspectos de determinismo, Visual Prolog soporta los


siguientes tipos de predicados:

erroneous: nunca debe fallar y debe producir 0 soluciones.


failure: puede fallar y debe producir 0 soluciones.
nondeterm: puede fallar y puede producir mltiples soluciones.
procedure: nunca debe fallar aunque pueden producirse errores en
tiempo de ejecucin y debe producir una nica solucin.
determ: puede fallar y debe producir una nica solucin, es decir, no
hacen backtracking.
multi: nunca debe fallar y puede producir mltiples soluciones
mediante la tcnica de backtracking.

El sistema de control de determinismo de Visual Prolog chequea la


correspondencia de las definiciones de predicados con los modos de
determinismo declarados para los predicados. Por defecto, el compilador
verifica las clusulas o reglas de predicados y da un warning si no puede
garantizar que un predicado declarado
como multi, procedure o erroneous nunca falla.
Todos los predicados se definen internamente con alguno de estos modos.
Para los predicados definidos como determ, procedure, failure o erroneous el
compilador dar un warning para cada clusula o regla del programa que d
como resultado un predicado no determinista.
Hay dos tipos de clusulas no deterministas:

Aquellas que no contienen un corte y hay una o ms clusulas que


pueden casar (o unificarse) con los mismos argumentos de entrada para
ese patrn de flujo de entrada.
Aquellas que llaman a un predicado no determinista y dicha llamada no
est seguida de un corte. Debido a esto, el no determinismo puede

extenderse por muchos predicados a menos que se utilicen uno o ms


cortes.
Cuando se escriben predicados declarados
como multi, procedure o erroneous se deben seguir un par de reglas:

Si alguna clusula de predicado puede fallar se debe definir al final una


clusula que no falle seguro.
De acuerdo a los dominios declarados, para cualquier posible conjunto
de elementos de entrada debe existir una clusula que tenga una cabeza
que case con dicho conjunto.

[NDICE]

Ejemplos de cmo conseguir la coherencia entre reglas y


predicados en el aspecto determinista
Como hemos dicho hay dos tipos de clusulas no deterministas: uno de los
tipos son aquellas que no contienen un corte y hay una o ms clusulas que
pueden casar (o unificarse) con los mismos argumentos de entrada para ese
patrn de flujo de entrada. Veamos un ejemplo de predicado definido como
determinista con un conjunto de clusulas que no son deterministas:
DOMAINS
list=integer*
PREDICATES
lista(list)
prueba
CLAUSES
lista([]).
lista([1]).
lista([1,2]):write("Hola").
lista(L):write(L).
prueba:lista([1,2]),
nl,
lista([1,2,3]).
GOAL
prueba.

Como vemos el conjunto de reglas para el predicado lista(list) son todas no


deterministas, ya que no aparece un corte en ellas y hay varias que pueden
casar con el mismo patrn de entrada. Por ejemplo, la lista vaca puede casar
en lista([]) y en lista(L).
Para resolver la incoherencia podemos tomar dos soluciones:

Hacer lista(list) no determinista escribiendo delante la palabra


reservada nondeterm.
Conseguir que cada clusula o regla que compone el predicado sea
determinista y para ello hay que hacer un uso correcto del corte. Esta
segunda solucin es ms correcta y optimizada en este caso, ya que lo
que se pretende en el ejemplo es que el predicado nos aporte una nica
solucin, es decir no interesa que haga backtracking ni siquiera forzado.

Vamos a suponer que forzamos el fallo tal y como tenemos actualmente


escrito el programa, para ello la nica variacin que hay que hacer es la
siguiente:
prueba:lista([1,2]),
nl,
lista([1,2,3]),
fail.

La ejecucin del programa produce el siguiente resultado:


Hola
[1,2,3][1,2]
[1,2,3]

Veamos el rbol de ejecucin que se ha generado en la Figura 1:

Figura 1
rbol de ejecucin

Nos interesa que el programa aporte una nica solucin y no un conjunto de


ellas, incluso si intentamos hacer backtracking de un modo forzado. El corte
nos proporciona capacidad para podar el rbol de ejecucin, por tanto, hemos
de poner tantos cortes como se requieran para conseguir que el programa
definido por el conjunto de reglas aporte una solucin nica en cualquier caso.
La modificacin realizada, la ejecucin del programa y el rbol de ejecucin
se presentan a continuacin, ver Figura 2:
lista([]):!.
lista([1]):!.
lista([1,2]):write("Hola"),!.
lista(L):write(L).

Hola
[1,2,3]

Figura 2
rbol de ejecucin
[NDICE]

Seccin de clusulas
La seccin de clusulas contiene la especificacin o implementacin del
conjunto de hechos y reglas que componen el programa. Dicha seccin se
encabeza con la palabra CLAUSES.
Una clusula puede ser:

Un hecho: por ejemplo padre(juan, maria).


Una regla de deduccin: por ejemplo abuelo(X, Y):-padre(X, Z),
padre(Z, Y). Como se observa la regla de deduccin se puede
interpretar del modo siguiente, la parte izquierda es cierta si la parte
derecha de la regla es cierta. Para ello deben ser ciertas todas las
clusulas separadas por conjunciones "," o, al menos, una de las que
estn separadas por disyunciones ";". Si una parte de la regla falla, se
intenta hacer backtracking con la inmediatamente anterior, y si esta es
la parte izquierda de la clusula con la clusula siguiente en caso de que
exista.

Una secuencia de clusulas que definen un predicado se denomina


procedimiento.

[NDICE]

Seccin de meta u objetivo


En esta seccin se coloca la meta u objetivo que deseamos que Prolog
satisfaga. Es similar a cualquier otra regla, ya que la meta est compuesta de
un conjunto de submetas que hay que demostrar, la principal diferencia reside
en que detrs de la palabra GOAL no se pone ":-", es decir no existe parte
izquierda de la regla, y sta se ejecuta directamente cuando arranca el
programa.
[NDICE]

Ejemplo
[CDIGO FUENTE] [EJECUTABLE]

Vamos a ver un ejemplo completo de cmo realizar un programa en Visual


Prolog haciendo uso de todas las secciones que hemos visto.
El programa debe gestionar una lista polimrfica de obras de arte. Las obras
de arte pueden ser cuadros o esculturas. Los datos que se deben almacenar en
un cuadro son el nmero de serie, el autor, el estilo y las dimensiones. Los
datos que se deben almacenar en una escultura son el nmero de serie, el autor
y el material.
El programa permitir insertar en orden las obras y visualizar listados de
cuadros y esculturas de forma separada.
Comencemos, pues a examinar el cdigo construido.
DOMAINS
obra=cuadro(INTEGER,STRING,STRING,STRING);
escultura(INTEGER,STRING,STRING)
LIST=obra*

En la seccin DOMAINS definimos el dominio obra, que agrupar dos tipos


de objetos compuestos: cuadros o esculturas.
El dominio LIST define el tipo lista polimrfica de obras de arte.
Grficamente tenemos:

PREDICATES
obtenerNS(INTEGER,obra)
insorden(obra,LIST,LIST)
pedirdatoscuadro(STRING,STRING)
pedirdatosescultura(STRING)
insertar(LIST,LIST,CHAR,INTEGER,STRING)
inserta(LIST,LIST)
eligeobra(CHAR,INTEGER,STRING)
escribircuadro(obra)
escribirescultura(obra)
nondetermrecorrerlista(LIST,SYMBOL)
nondetermejecutaropcion(INTEGER,LIST,LIST)
programa(LIST)
menu(INTEGER)

En la seccin PREDICATES hemos definido el nombre y el tipo de los


argumentos de todos los predicados que se usarn durante el programa.
En la seccin CLAUSES tenemos el conjunto de reglas o clusulas que
implementan cada predicado.
Vamos a describir brevemente lo que hace cada regla.
CLAUSES

obtenerNS(Serie,Predicado):Predicado=cuadro(Serie,_,_,_),!.
obtenerNS(Serie,Predicado):Predicado=escultura(Serie,_,_).

La regla obtenerNS tiene dos parmetros: un INTEGER y una obra. El


segundo parmetro es de entrada y el primer parmetro es de salida. Cuando
unificamos la variable Predicado que tras la llamada a la regla estar
instanciada, sta almacenar o un cuadro o una escultura. Si almacena un
cuadro la comparacinPredicado=cuadro(Serie,_,_,_) ser cierta y la
variable Serie se instanciar con el valor del nmero de serie del cuadro. Si
almacena una escultura, la primera regla fallar y pasaremos a comparar
el Predicado con el objeto escultura(Serie,_,_). La unificacin ser posible ya
que si no es un cuadro es una escultura y en este caso estaremos obteniendo el
nmero de serie de una escultura.
insorden(E,[],[E]):!.
insorden(E,[X|Y],[X|Cola]):obtenerNS(Serie1,E),
obtenerNS(Serie2,X),
Serie1>Serie2,
insorden(E,Y,Cola),!.
insorden(E,LOr,[E|LOr]).

El predicado insorden admite tres parmetros: un elemento de entrada de


tipo obra y otro de tipo LIST y por ltimo un elemento de salida tambin de
tipo LIST.
El predicado est implementado mediante tres reglas:

La primera regla satisface los objetivos en los que se pretenda insertar


un elemento en una lista vaca.
La segunda regla satisface los objetivos en los que se pretenda insertar
un elemento que es mayor que el que est a la cabeza de la lista en ese
instante. En este caso es necesario seguir recorriendo la lista mediante
una llamada recursiva para insertar el elemento en la posicin correcta.
La tercera regla satisface los objetivos en los que se pretenda insertar
un elemento inmediatamente porque ya se ha encontrado el lugar
adecuado para el mismo.
pedirdatoscuadro(Estilo,Dimensiones):nl,write("Estilo:"),
readln(Estilo),
write("Dimensiones:"),
readln(Dimensiones).

El predicado pedirdatoscuadro acepta dos parmetros de salida: el estilo y las


dimensiones del cuadro. La regla que lo implementa simplemente rellena las
variables con los contenidos capturados a travs del teclado.
pedirdatosescultura(Material):nl,write("Material:"),
readln(Material).

El predicado pedirdatosescultura acepta un parmetro de salida: material de la


escultura. La regla que lo implementa simplemente rellena la variable con el
contenido capturado a travs del teclado.
insertar(L,NuevaL,Seleccion,NS,Autor):Seleccion='c',
pedirdatoscuadro(Estilo,Dimensiones),
Registro=cuadro(NS,Autor,Estilo,Dimensiones),
insorden(Registro,L,NuevaL),!.
insertar(L,NuevaL,Seleccion,NS,Autor):Seleccion='e',
pedirdatosescultura(Material),
Registro=escultura(NS,Autor,Material),
insorden(Registro,L,NuevaL).

El predicado insertar acepta cinco parmetros, todos de entrada


salvo NuevaL que es de salida. Las reglas que implementan este predicado
funcionan de modo similar. Si el parmetro Seleccion contiene el carcter "c"
en el objetivo propuesto, ejecutaremos la primera regla, de modo que
estaremos insertando un cuadro. Si el parmetro Seleccion contiene el carcter
"e", ejecutaremos la segunda regla, de modo que estaremos insertando una
escultura en la lista NuevaL.
eligeobra(Seleccion,NS,Autor):write("EscribeelNmerodeSerie:"),
readint(NS),
write("EscribeelNombredelAutor:"),
readln(Autor),
write("Selecciona[c]=Cuadroo[e]=Escultura>"),
readchar(Seleccion).

El predicado eligeobra acepta tres parmetros de salida. En la regla que lo


implementa las variables se rellenan con los contenidos obtenidos a travs del
teclado.
inserta(L,NuevaL):eligeobra(Seleccion,NS,Autor),

insertar(L,NuevaL,Seleccion,NS,Autor).

El predicado inserta acepta dos parmetros de tipo LIST, el primero de entrada


y el segundo de salida. La regla que lo implementa se satisface mediante la
resolucin de la regla eligeobra y posteriormente con una llamada
a insertar con los resultados obtenidos de la resolucin de la regla precedente.
escribircuadro(cuadro(NS,Autor,Estilo,Dimensiones)):
write("ObradeArte=>CUADRO"),nl,
write("NmerodeSerie:"),Aux1=NS,write(Aux1),nl,
write("Autor:"),Aux2=Autor,write(Aux2),nl,
write("Estilo:"),Aux3=Estilo,write(Aux3),nl,
write("Dimensiones:"),Aux4=Dimensiones,write(Aux4),nl,
write(""),nl,
write("Pulsaparacontinuar..."),
readint(_).

El predicado escribecuadro acepta por parmetro un elemento de tipo obra,


luego la regla que lo implementa acepta como parmetro un objeto compuesto
de tipocuadro que est englobado dentro del dominio obra. Esta regla
simplemente actualiza los parmetros del objeto compuesto con los
contenidos obtenidos desde teclado.
escribirescultura(escultura(NS,Autor,Material)):
write("ObradeArte=>ESCULTURA"),nl,
write("NmerodeSerie:"),Aux1=NS,write(Aux1),nl,
write("Autor:"),Aux2=Autor,write(Aux2),nl,
write("Material:"),Aux3=Material,write(Aux3),nl,
write(""),nl,
write("Pulsaparacontinuar..."),
readint(_).

El predicado escribeescultura acepta por parmetro un elemento de tipo obra,


luego la regla que lo implementa acepta como parmetro un objeto compuesto
de tipo escultura que est englobado dentro del dominio obra. Esta regla
simplemente actualiza los parmetros del objeto compuesto con los
contenidos obtenidos desde teclado, como en el caso anterior.
recorrerlista([],_):!.

recorrerlista([X|Y],Que):Que=cu,
escribircuadro(X),
recorrerlista(Y,Que),!.
recorrerlista([X|Y],Que):Que=es,
escribirescultura(X),
recorrerlista(Y,Que),!.
recorrerlista([_|Y],Que):recorrerlista(Y,Que).

El predicado recorrerlista acepta dos parmetros de entrada. Est


implementado mediante cuatro reglas:

La primera satisface el objetivo en el que la lista a recorrer est vaca.


La segunda y tercera regla satisfacen objetivos en los que el parmetro
Que decide que tipo de obra de arte hay que visualizar, bien un cuadro
o bien una escultura.
La cuarta regla satisface objetivos en los que no hemos de visualizar el
elemento cabeza de la lista en ese instante porque no coincide con el
tipo de elemento que deseamos mostrar.
ejecutaropcion(0,L,L):recorrerlista(L,cu),!.
ejecutaropcion(1,L,L):recorrerlista(L,es),!.
ejecutaropcion(2,L,NuevaL):inserta(L,NuevaL).

El predicado ejecutaropcion admite 3 parmetros, de los cuales los dos


primeros son de entrada y el ltimo de salida. Tres posibles reglas
implementan el predicado:

La primera se satisface cuando el usuario selecciona la opcin 0 a


travs del men. Eso significa que hay que visualizar todos los cuadros
de la lista.
La segunda se satisface cuando el usuario selecciona la opcin 1 a
travs del men. En este caso hay que mostrar todas las esculturas.
La tercera regla es satisfecha cuando el usuario selecciona la opcin 2,
y permite insertar un nuevo elemento en la lista mediante una llamada
al predicadoinserta.
menu(Opcion):write("MENU"),nl,
write("[Link]"),nl,
write("[Link]"),nl,
write("[Link]"),nl,
write("[Link]"),nl,

write(""),nl,
write("Opcin:"),
readint(Opcion),
write(""),nl.

El predicado menu acepta un parmetro de salida. La regla que lo implementa


muestra al usuario el conjunto de posibles opciones y almacena en la
variable Opcionel contenido seleccionado a travs de teclado.
programa(L):menu(Opcion),
Opcion<>3,
ejecutaropcion(Opcion,L,NuevaL),!,
programa(NuevaL),!.
programa(_):write("Hastapronto..."),nl.

El predicado programa admite como parmetro de entrada una lista de obras


de arte. Est implementado mediante dos reglas:

La primera que presenta el men de opciones y comprueba si se ha


seleccionado la opcin 3. En ese caso falla y pasa a satisfacer la
segunda regla que implementa este predicado. Si la opcin seleccionada
no es la 3, se llama al predicado ejecutaropcion para tratar la lista, y por
ltimo se hace una llamada recursiva a programa para que esta vez
acte sobre la nueva lista obtenida.
La segunda regla implementa lo que debe satisfacerse en caso de que el
usuario haya elegido la opcin de salir de la aplicacin.
GOAL
programa([]).

La meta definida es una llamada a programa pasndole por parmetro una


lista vaca, esta llamada se unificar con la primera regla del predicado
programa y dispondremos ya de la variable local L iniciada para comenzar a
trabajar con nuestra lista de obras de arte.
[NDICE]

El entorno de desarrollo de Visual Prolog


El entorno de desarrollo de Visual Prolog nos proporciona la capacidad de
generar aplicaciones lgicas orientadas a eventos para Windows 95 y 98 de
forma sencilla. Disponemos de capacidades de creacin de programas de
forma visual y esto implica que el cdigo que implementa la interfaz de

usuario sea generado en su mayor parte por el propio Experto del entorno de
desarrollo.
De lo que se tiene que encargar el programador, por tanto, es de especificar las
tareas que se deben llevar a cabo como respuesta a los sucesos o eventos que
se producen en el sistema.
Antes de profundizar en el estudio de este entorno, demos un repaso breve a
los conceptos sobre los que se apoya la programacin orientada a eventos.
[NDICE]

Aplicaciones orientadas a eventos


En una aplicacin DOS, el programador fija la secuencia de operaciones en
tiempo de diseo. No existe apenas interaccin entre la aplicacin diseada y
otras aplicaciones y el sistema operativo no produce interferencias.
Las aplicaciones DOS suelen comunicarse directamente con el usuario y se
basan en una filosofa de implementacin esttica.
Los sistemas Windows, en cambio, soportan una filosofa dinmica. En estos
casos, el sistema operativo provee a las aplicaciones de una capa de servicios
para su comunicacin con el usuario, de este modo el sistema operativo se
convierte en un objeto activo que el programador debe conocer ya que
participa en la ejecucin y secuenciacin de las aplicaciones dentro de un
mbito multitarea. Las aplicaciones deben contemplar esta caracterstica y la
metodologa de construccin de las mismas se denomina diseo orientado a
eventos.
Cuando el usuario realiza una operacin para interactuar con el sistema
(pulsar una tecla, mover el ratn,...), se produce un suceso o evento. Dicho
evento es generado desde el interfaz hardware y el sistema operativo lo
traduce a un mensaje con formato estndar y enva una notificacin de evento
al propietario correcto que generalmente es la ventana activa (la que tiene el
foco).
Los eventos pueden llegar a la aplicacin de forma asncrona, por ello es
necesario escribirla cuidadosamente, notando en cada momento que nos
movemos en un entorno multitarea donde el resto de aplicaciones y el sistema
operativo son objetos plenamente activos, para conseguir que se mantenga la
integridad tanto de procesos como de datos.
Para cada evento debe existir un manejador de evento, que contiene el cdigo
que se ha de ejecutar tras producirse el suceso al que se encuentra vinculado.

Cuando el programador escribe el programa asocia un manejador a cada


evento que desea que se trate. Los manejadores, normalmente, son rutinas con
una cabecera preestablecida y un cuerpo vaco que debe ser rellenado con las
instrucciones apropiadas.
Si el programador no define un manejador propio para un evento determinado,
dicho evento es tratado por defecto por el sistema.
[NDICE]

Aplicaciones orientadas a eventos en Visual Prolog


La interfaz de un programa en Visual Prolog va a ser simplemente un conjunto
de ventanas de aspectos y tipos distintos organizadas mediante una jerarqua.
La ventana principal se denomina ventana de tareas o Task Window.
Cada ventana tiene un nmero que la identifica dentro del sistema, ese nmero
se denomina manejador (handler) de la ventana.
Dado que las ventanas se encuentran organizadas en un sistema jerrquico
podemos hablar de que cada ventana tiene un padre.
Cada ventana lleva asociado un predicado que maneja todos los eventos para
la misma. Dicho predicado pertenece al dominio EHANDLER y tiene dos
argumentos importantes:

El manejador de la ventana: handler.


Un predicado que describe el evento producido, de ahora en adelante
evento.

Adems los predicados del dominio EHANDLER pueden devolver valores a


travs de un parmetro de retorno del dominio LONG que se usan en muy
pocos casos. Normalmente, se devuelve 0.
El entorno de desarrollo de Visual Prolog proporciona un dilogo llamado
Experto a partir del cual se generar parte del cdigo que tiene que ver con la
implementacin de la interfaz de la aplicacin.
Los predicados manejadores de evento para cada ventana deben ser
generalmente declarados y creados a travs del Experto. El programador debe
escribir personalmente el cdigo a incluir en el cuerpo de los manejadores de
evento ya declarados por el Experto para los eventos que desee controlar de
forma explcita. El resto de eventos sern manejados por defecto por el
sistema.

[NDICE]

Tipos de ventanas en Visual Prolog


Como hemos comentado anteriormente, la interfaz de una aplicacin no es
ms que un conjunto de ventanas organizadas de modo jerrquico.
Sin embargo, no todas las ventanas tienen la misma finalidad: un botn no es
lo mismo que un dilogo.
Veamos los diferentes tipos de ventanas que existen:
Windows: Existen distintos tipos de ventanas dependiendo del lugar que
ocupen en la jerarqua, Tabla 2.
Tipo

Descripcin

Task Window

Es una abstraccin de la aplicacin en s misma. Es la ventana principal del


programa y la inicializacin y finalizacin de ste estn siempre asociados a
dicha ventana. Bajo el modo MDI (Multiple Document Interface) la ventana
principal acta como contenedor de las ventanas hijas.

Screen Window

Es una abstraccin que representa la pantalla entera. Esta ventana siempre


es el padre de la Task Window.

Top-Level
Window

Se trata de un documento normal de Windows cuyo padre puede ser


la TaskWindow o la Screen Window. Pueden almacenar ventanas hijas y
controles y, a menudo, contienen mens y pueden ser maximizadas y
minimizadas.

Child Windows

Estn restringidas a permanecer dentro del su ventana padre. Cuando la


ventana padre es cerrada, destruida, minimizada, etc., tambin lo son las
ventanas hijas.

Print

Ventana interna usada durante el proceso de impresin

Picture

Ventana interna usada durante el proceso de creacin de un grfico,


imagen o dibujo.

Metafile

Ventana interna usada durante la creacin de un metafile.


Tabla 2

Dialogs: Los dilogos son un tipo especial de ventanas, cuya funcionalidad


est reducida con respecto a las ventanas normales. Los dilogos normalmente
se rellenan con controles, que puede interactuar con el usuario para visualizar

salidas, aceptar entradas, ofrecer mtodos de seleccin de opciones o permitir


la edicin de texto. Los dilogos pueden ser de dos tipos, Tabla 3:
Tipo

Descripcin

Dilogo modal

Hasta que el dilogo no es cerrado no se puede acceder a las ventanas de la


aplicacin que se encuentran debajo de dicho dilogo.

Dilogo no modal

Es posible acceder a lo que est debajo del dilogo antes de haberlo cerrado.
Tabla 3

Controls: Son pequeas ventanas con una apariencia especial y una


funcionalidad fija proporcionada por el sistema operativo. Se usan dentro de
conjuntos fijos de controles dentro de otras ventanas, principalmente como
componentes de dilogos. Los controles proveen al usuario la capacidad de
escribir texto, llamar a comandos o elegir opciones. Los eventos que se
generan por la manipulacin de los controles causan notificaciones de
mensajes que se envan al manejador de eventos de la ventana padre. Existen
varios tipos de controles, Tabla 4:
Tipo

Descripcin

PushButton

Botn tpico que puede apretarse y soltarse.

RadioButton

Botn de aspecto redondo que suele estar agrupado con otros de la misma clase
y slo uno de ellos permanece activo simultneamente.

CheckBox

Botn de aspecto cuadrado que puede estar o no marcado.

HScroll

Barra de scroll horizontal.

VScroll

Barra de scroll vertical.

Edit

Cuadro o ventana de edicin de texto.

Text

Etiqueta de texto esttico.

LBox

Lista de opciones o cadenas que pueden ser seleccionadas.

LBoxButton

Lista desplegable de opciones.

LBoxEdit

Lista desplegable de texto que puede editarse.

Icon

Icono.

Custom

Control personalizado.
Tabla 4

Los identificadores de los tipos de ventanas pertenecen al


dominio WINTYPE y tienen w_ delante del nombre especificado para las
ventanas, wc_ para los controles y wd_ para los dilogos.
Cuando se crea cualquier tipo de ventana o dilogo existen varios flags que
determinan la apariencia del dilogo y que permiten conocer el estado del
objeto sobre el que se est actuando.
[NDICE]

También podría gustarte