Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Entorno de desarrollo
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
Significado
bgidriver
bgifont
check_determ
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
diagnostics
error
errorlevel
heap
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
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
project
[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.
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.
LECTOR=lee(SYMBOLNombre,LECTURAItem)
LECTURA=libro(SYMBOLAutor,SYMBOLTitulo,SYMBOLEditorial);
revista(SYMBOLTitulo,INTEGERNumero)
3 Solutions
[NDICE]
[NDICE]
ENTERO no es ms que un sinnimo de integer que puede ser usado del mismo
modo que este ltimo.
[NDICE]
[NDICE]
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).
Y=manolo
Y=beatriz
Y=carlos
4 Solutions
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
padre(pepe,L).
[NDICE]
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.
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.
Figura 1
rbol de ejecucin
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
Ejemplo
[CDIGO FUENTE] [EJECUTABLE]
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)
readint(_).
write("Opcin:"),
readint(Opcion),
write(""),nl.
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]
Descripcin
Task Window
Screen Window
Top-Level
Window
minimizadas.
Child Windows
Picture
Metafile
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
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
RadioButton
Botn de aspecto redondo que suele estar agrupado con otros de la misma clase
y slo uno de ellos permanece activo simultneamente.
CheckBox
HScroll
VScroll
Edit
Text
LBox
LBoxButton
LBoxEdit
Icon
Icono.
Custom
Control personalizado.
Tabla 4
Para ello accedemos a la opcin New Project del men principal Project, ver
Figura 3 .
El dilogo que aparece nos permite configurar el mtodo de desarrollo de nuestra
aplicacin de una forma muy sencilla. Los pasos a seguir son los siguientes:
1. Establecer un nombre para la aplicacin en la caja de
texto Project Name.
2. Seleccionar un directorio base para la aplicacin mediante
la utilizacin de la caja de texto Base Directory.
3. Accionar la pestaa Target. A travs de ella se configura el
tipo de plataforma donde se ejecutar el programa, el tipo
de estrategia de interfaz de usuario que se utilizar, si lo
que se pretende generar es una aplicacin exe o una dll y
por ltimo, seleccionar el lenguaje de programacin que se
usar para generar el programa principal. De no
seleccionar VPI como estrategia de generacin de la
interfaz de usuario las opciones de la pestaa VPI
Options aparecern desactivadas, en caso contrario se
permitir seleccionar el conjunto de paquetes que se
incluirn en la aplicacin para montar la interfaz.
4. Accionar el resto de pestaas para configurar otros objetos
ms avanzados como el tipo de generacin de cdigo, la
inclusin de objetos para manejar bases de datos, la
introduccin de los datos personales del programador y la
colocacin de elementos de ayuda en la aplicacin.
Figura 3
Aspecto del Experto de creacin de una aplicacin
En la parte izquierda tenemos activos los botones que nos permiten crear nuevos
componentes para la aplicacin. En la parte derecha aparecen los botones que
permiten editar y borrar componentes aadidos, as como editar sus atributos, y
acceder a la ventana de cdigo experto que nos permitir crear fcilmente las
cabeceras de nuestros manejadores de evento.
Antes de eliminar las opciones del men nos tenemos que asegurar de eliminar
tambin todo el cdigo asociado a cada evento producido por la seleccin de
cualquiera de las opciones. Para ello es necesario observar la ventana de Cdigo
Experto y buscar en ella los eventos asociados al men para eliminar las
clusulas manejadoras introducidas automticamente por el sistema.
Vemos, ahora, el dilogo ya diseado que debe aparecer tras la pulsacin del
botn Calcular. Posee tres elementos: dos etiquetas, una de informacin y otra
para volcar el valor de la velocidad en ella y un botn de aceptacin. Como el
dilogo es modal, hasta que no lo cerremos no podremos actuar sobre la ventana
principal.
L=["autopista","autovia","viarapida","de_via_urbana","de_travesia","nohay"],
lbox_Add(W,L),
%ENDInicializacindelaLISTBOX
!.
%ENDTaskWindow,e_Create
tipovehiculo(_Win,Veh),%Obtencindeltipodevehculo
obtenernumerocarriles(Mas_de_1_carril,Carril_de_adelantamiento,Carriles),
velocidad(Veh,Arcen,Carriles,Senal,VelocidadMaxima),
assert(la_velocidad(VelocidadMaxima),misdatos),
dlg_calculo_Create(_Win),
!.
task_win_eh(_Win,e_Control(idc_calcular,_CtrlType,_CtrlWin,_CtlInfo),0):dlg_Error("Selecciona
adecuadamentelosparmetros"),!.
%ENDTaskWindow,idc_calcular_CtlInfo
haber rellenado. Una vez que los tiene, ejecuta el predicado velocidad que ya
vimos en el caso de la aplicacin no VPI en teora. El predicado devuelve
un integer en la variable local VelocidadMaxima.
Como en Prolog no existen las variables globales no podemos pasar el contenido
de dicha variable a la etiqueta que debe visualizarlo en el dilogo de un modo
sencillo. Podemos intentar conseguir el manejador del dilogo a travs de su
padre, y a continuacin intentar obtener el manejador del control a travs del
obtenido del dilogo, aunque esta opcin es un poco complicada.
Otra posibilidad es hacer uso de hechos que pueden ser generados
dinmicamente. Podemos generar un hecho del tipo la_velocidad(INTEGER) que
sea single. As pues en el manejador de botn almacenamos un hecho con la
velocidad calculada mediante assert, y en el evento de creacin del dilogo
podemos capturar esta velocidad extrayendo el argumento del hecho almacenado.
[NDICE]
TEMA 2
Aritmtica, datos y estructuras en Visual Prolog
[NDICE]
Operaciones
Operando 1
Operador
Operando 2
Resultado
entero
+, -, *
entero
entero
real
+, -, *
entero
real
entero
+, -, *
real
real
real
+, -, *
real
real
entero real
entero real
real
entero
div
entero
entero
entero
mod
entero
entero
Tabla 1
[NDICE]
Orden de evaluacin
Si la expresin contiene subexpresiones entre parntesis, las subexpresiones se
evalan primero.
Si la expresin contiene multiplicacin o divisin, estas operaciones son
realizadas trabajando de izquierda a derecha a travs de la expresin.
Prioridad
+-
* / mod div
- + (unario
Tabla 2
[NDICE]
Funciones y predicados
Visual Prolog posee una gran cantidad de funciones y predicados matemticos
para realizar las ms variadas operaciones. La lista completa se ofrece en la Tabla
3.
Nombre
Descripcin
X mod Y
X div Y
abs(X)
Valor absoluto de X.
cos(X)
Coseno de X.
sin(X)
Seno de X.
tan(X)
Tangente de X.
arctan(X)
Arcotangente de X.
exp(X)
ln(X)
Logaritmo neperiano de X.
log(X)
Logaritmo en base 10 de X.
sqrt(X)
Raz cuadrada de X.
random(X)
random(X, Y)
round(X)
trunc(X)
val(domain,X)
Tabla 3
[NDICE]
Comparaciones
En Visual Prolog podemos comparar expresiones aritmticas, caracteres, cadenas
de caracteres y smbolos.
Las comparaciones de este tipo se realizan a travs de operadores relacionales.
Ver Tabla 4.
Smbolo
Relacin
<
menor que
<=
igual que
>
mayor que
>=
<> o ><
distinto
Tabla 4
[NDICE]
OBJETOS COMPUESTOS
Los objetos compuestos estn formados por un functor y un conjunto de
argumentos. Por ejemplo, cuadro(NS, Autor, Estilo, Dimensiones) representa una
estructura que almacena los datos ms relevantes para describir este tipo de obra
de arte. El nombre cuadro es el functor y los elementos entre parntesis son los
argumentos del objeto compuesto. Los argumentos (campos), de un objeto
compuesto pueden ser datos simples o datos complejos.
Para definir objetos compuestos es necesario introducirnos en el concepto
de DOMINIO o DOMAINS. Como veremos en la seccin de prcticas, la
seccin DOMAINS de un programa en Visual Prolog agrupa los dominios (tipos),
no estndares en el sistema.
Definir un dominio no es ms que establecer qu forma tendrn los objetos que
pertenecen a dicho dominio o tipo, por ejemplo, para el caso del cuadro, el
dominio sera as:
un_cuadro= cuadro(INTEGER, STRING, STRING,
STRING)
Como hemos dicho, los argumentos de un objeto compuesto pueden ser
complejos:
un_comprador= comprador(STRING, un_cuadro)
El dominio o tipo del ejemplo define a un comprador de un cuadro. Los objetos
compuestos de este tipo almacenan una cadena que puede representar el DNI y el
cuadro que posee.
Veamos varios objetos de tipo un_comprador:
comprador("111111111", cuadro(1239, "Martn
Jimnez", "leo", "39x23")).
RBOLES
Un rbol es una estructura con una definicin puramente recursiva, ya que se
puede considerar como el elemento raz cuyos hijos son, a su vez, rboles. Si el
rbol tiene nicamente dos hijos se denomina rbol binario. Este modelo
especfico de rbol se utiliza mucho para resolver gran cantidad de problemas en
aspectos de programacin.
Un rbol se puede considerar, a su vez, un caso particular de grafo, donde todos
los caminos son acclicos.
La Figura 1 muestra un ejemplo de rbol.
Figura 1
Ejemplo de rbol
Figura 2
domains
arbol=nodo(integer,arbol,arbol);vacio
lista=integer*
predicates
concatenar(lista,lista,lista)
preorden(arbol,lista)
inorden(arbol,lista)
postorden(arbol,lista)
clauses
concatenar([],[],[]):!.
concatenar([],L2,L2):!.
concatenar(L1,[],L1):!.
concatenar([X|Y],L2,[X|Aux]):concatenar(Y,L2,Aux).
preorden(vacio,[]):!.
preorden(nodo(X,Izq,Der),[X|L]):preorden(Izq,L1),
preorden(Der,L2),
concatenar(L1,L2,L).
inorden(vacio,[]):!.
inorden(nodo(X,Izq,Der),L):inorden(Izq,L1),
inorden(Der,L2),
concatenar(L1,[X|L2],L).
postorden(vacio,[]):!.
postorden(nodo(X,Izq,Der),L):postorden(Izq,L1),
postorden(Der,L2),
concatenar(L1,L2,L3),
concatenar(L3,[X],L).
goal
inorden(nodo(1,nodo(2,nodo(4,vacio,vacio),nodo(5,vacio,vacio)),nodo(3,vacio,vacio)),L1),
preorden(nodo(1,nodo(2,nodo(4,vacio,vacio),nodo(5,vacio,vacio)),nodo(3,vacio,vacio)),L2),
postorden(nodo(1,nodo(2,nodo(4,vacio,vacio),nodo(5,vacio,vacio)),nodo(3,vacio,vacio)),L3).
[NDICE]
LISTAS
Una lista se puede considerar como un caso particular de rbol del modo que se
muestra en la Figura 3.
Figura 3
Lista implementada en forma de rbol
A su vez, una lista se puede considerar de forma recursiva. Es decir, siempre est
formada por un elemento seguido de otra lista (ver Figura 4). Cuando la lista
tienen un slo elemento podemos considerar que est formada por dicho
elemento y la lista vaca. Esta definicin es muy interesante, ya que su
conocimiento nos permitir llevar a cabo todos las operaciones que se pueden
realizar sobre las listas con poco esfuerzo.
Figura 4
Definicin recursiva de una lista
listaenteros=integer*
elementos= i(integer); s(symbol); c(char); le(listaenteros)
lista= elementos*
Ejemplo:
domains
listaenteros=integer*
elementos=i(integer);c(char);s(symbol);le(listaenteros)
lista=elementos*
predicates
recorrer(lista)
clauses
recorrer([]):!.
recorrer([X|Y]):write(X),nl,recorrer(Y).
goal
recorrer([i(1),c('a'),s(pepe),i(5),c('b'),le([1,2,3])]).
Se observa que la lista puede contener cuatro tipo de elementos distintos: enteros,
caracteres, smbolos y listas de enteros. En la seccin de declaracin del dominio
o tipo elementos no podemos escribir:
elementos=integer;char;symbol;listaenteros
para expresar que dicho dominio agrupa a cuatro tipos de elementos distintos
sino que la sintaxis a utilizar es aquella que representa que elementos agrupa a
cuatro tipos de objetos compuestos distintos.
El resultado de la ejecucin de la meta es el siguiente:
i(1)
c('a')
s("pepe")
i(5)
c('b')
le([1,2,3])
yes
Las operaciones tpicas que se pueden realizar sobre listas son: la insercin de
elementos al principio, al final, en orden; borrado, bsqueda de elementos,
recorrido, eliminacin de duplicados y, en general, todas las de las que se pueden
realizar sobre conjuntos de elementos tales como: interseccin, unin, diferencia,
pertenencia, comprobacin de lista vaca, concatenacin, etc.
Las listas se pueden utilizar para implementar otras estructuras tales como listas
circulares, vectores, pilas, colas, rboles, grafos y matrices.
De cada estructura nos interesa saber cules son los algoritmos para acceder a
ellas. Una vez que conocemos, perfectamente, el tipo de operaciones que las
definen, cualquier tipo de implementacin es vlida. Por ejemplo, es frecuente
usar una implementacin mediante listas para plasmar matrices.
Por otro lado, es fundamental aplicar tcnicas de diseo descendente para
resolver todos nuestros problemas e implementar las estructuras necesarias en
nuestras aplicaciones.
MATRICES
Podemos definir matrices a partir de listas, primero de 2 dimensiones y, ms
tarde, generalizar matrices de dimensin N.
En un lenguaje imperativo, recorrer una matriz de dos dimensiones implica el uso
de un par de bucles anidados, que proporcionan una complejidad
computacional O(n2). Sin embargo, en Prolog, no disponemos de este tipo de
estructuras de control, por tanto, cualquier operacin debe ser resuelta de forma
recursiva mediante la declaracin formal de su enunciado.
Un tratamiento elemento a elemento de las matrices tal y como se realiza en un
lenguaje imperativo no es adecuado en Prolog, por tanto, conviene entender la
estructura matriz como una lista de listas, y aplicar los algoritmos diseados
sobre listas para resolver problemas matriciales.
domains
fila=integer*
matriz=fila*
predicates
sumafila(fila,fila,fila)
sumar(matriz,matriz,matriz)
clauses
/*Predicadoparacalcularlasumadeloselementosdeunafila*/
sumafila([],[],[]):!.
sumafila([],L2,L2):!.
sumafila(L1,[],L1):!.
sumafila([C1|Cola1],[C2|Cola2],Res):S=C1+C2,
sumafila(Cola1,Cola2,ColaRes),
Res=[S|ColaRes].
/*Predicadoderecorridodelasfilasparasumarloselementosmedianteelusodelpredicado
anterior*/
sumar([],[],[]):!.
sumar([],L2,L2):!.
sumar(L1,[],L1):!.
sumar([C1|Cola1],[C2|Cola2],LR):sumafila(C1,C2,Res),
sumar(Cola1,Cola2,ColaRes),
LR=[Res|ColaRes].
goal
sumar([[1,2,3],[2,2,2],[4,4,4]],[[1,1,1],[2,1,2],[1,2,3]],R).
[NDICE]
Bibliografa
[Adarraga, 1994] Adarraga, Pablo. Zaccagnini Jos Luis. "Psicologa e
Inteligencia Artificial". Editorial Trotta. 1994.
[NDICE]
Contenido
[ ocultar ]
1 Conceptos
2 El Programa de
3 de dilogo no modal: Aspectos Conceptuales
4 El paquete FamilyData
5 Interfaces
6 El paquete FamilyDL
7 del Cdigo para el paquete de familyDL
8 del Cdigo para el paquete de familyBLL
9 Caractersticas de una capa de datos
10 Conclusin
11 Referencias
Conceptos
Hay un proverbio chino que dice as: "Dale a un hombre un pescado y lo alimentars por un da
Ensale a pescar y lo alimentars toda la vida.". Hay una leccin en la programacin de all. A
veces es mejor sustituir los datos ( un pescado ) con un mtodo ( el procedimiento de la pesca )
que puede conducir a los datos.
Este concepto se puede ampliar an ms un poco ms. Por ejemplo, si antes de ensear la pesca
persona directamente, el hombre se le ensea los principios de la obtencin de alimentos de la
naturaleza, entonces la persona tiene una mejor oportunidad de conseguir alimentos para su
familia.
Pero aqu hay una advertencia: explicar las cosas con analogas puede ser un poco problemtico,
porque, cuando se estira una analoga demasiado lejos, se rompe! En el ejemplo anterior, si se le
da al pescador una capa ms , entonces l puede morir de hambre antes de que pueda cosechar
los frutos de su buena educacin!
Esta forma de conexin en cadena de reunir una serie de actividades para lograr el objetivo final
que se puede hacer tambin en la programacin. Pero entonces, esto tiene que hacerse de
manera inteligente, de acuerdo con las exigencias que plantea la complejidad del problema de
software que est tratando de manejar. Aunque se puede decir que ms las capas que se
introducen, mejor es el control al llegar a la meta final; se necesita para configurar las capas
despus de la previsin cuidadosa.
Si usted ve el patrn que ha evolucionado a travs de toda la familia de la serie de tutoriales
(Prolog fundamental Visual, Visual Prolog Fundamental - GUI, Visual Prolog fundamental - la
capa de negocio lgico), se dara cuenta de lo mismo: las capas ms y ms refinadas eran
presentacin que finamente controlado el comportamiento del programa. Al mismo tiempo, no
existan las capas innecesarias - si as fuera, sera slo han aumentado la complejidad y la
burocracia que conlleva el programa.
En este tutorial, vamos a introducir la capa de datos. El ncleo de la capa de datos no es ms
que una clase, y los objetos de esa clase se puede utilizar para acceder y configurar los datos
reales. En el tutorial anterior, tenga en cuenta que la capa de lgica de negocios (BLL) maneja
los datos tambin. Esta vez, el CSP se manejar solamente la lgica.
El Programa de
Pero en primer lugar, vamos a entender las distintas partes del programa con la ayuda del
archivo family4.zip suministrado. En este tutorial, no estamos presentando el cdigo que se
necesita (cosa este tutorial ser demasiado larga). Todo el cdigo est presente en el ejemplo
para el tutorial. Usted puede leer el cdigo desde el IDE, cuando se carga el proyecto
all. Algunos parcial de cdigo es, sin embargo, aqu presentes, para una referencia rpida.
Cuando se carga el proyecto ( family4 ) en el IDE de Visual Prolog, te dars cuenta de cuatro
paquetes separados, como se muestra a continuacin:
Estos paquetes son los FamilyBLL, FamilyData , FamilyDL y paquetes TaskWindow. El ltimo
paquete (es decir, TaskWindow) se crea automticamente por el IDE, cuando se crea el
proyecto. El mtodo para crear los otros paquetes se explica en un tutorial anterior.
El proyecto fue creado de una manera similar que se explica en un tutorial anterior. No hay
sorpresas all. Pero aqu hay un poco de explicacin de algo nuevo.
Hay una ms de dilogo que se introduce en el TaskWindow paquete en comparacin con
el tutorial anterior. Este es elNewPersonDialog , que se muestra a continuacin. (Ya
hemos incluido este cuadro de dilogo en el proyecto. Sin embargo, la explicacin a
continuacin pretende que se est creando este cuadro de dilogo por su cuenta en el
proyecto.)
Este dilogo es un dilogo modal, que se utiliza para recoger la informacin de una
nueva persona que va a ser insertado en la base de datos actual. Como se puede ver
en la imagen de arriba, hay un campo de edicin de texto (idc_name) para recoger el
nombre, una serie de botn de radio (idc_male y idc_female) para encontrar el
gnero, y otros dos campos de texto de edicin (idc_parent1 y idc_parent2) a
encontrar a los padres de la persona que se aade a la base de datos. Un cuadro de
dilogo modal es uno, que puede permanecer abierta y activa, sin interferir en el
funcionamiento de otras partes de la interfaz grfica de usuario.
No hay ninguna diferencia entre un modal y no modal de dilogo cuando se est
creando. Sin embargo, al establecer sus atributos que debe tener cuidado de
especificar que es de hecho un modal uno, como se muestra a continuacin:
Tenga en cuenta que en un tutorial anterior (Prolog fundamental Visual GUI), que haba mostrado cmo crear un controlador de eventos para un
elemento de men mediante el asistente de cdigo anterior.
idc_name ) ) ,
Nombre "" ,
MaleBool = vpi :: winIsChecked ( VPI :: winGetCtlHandle
( thisWin, tratar ,
!,
El paquete de FamilyData
En este ejemplo, vamos a crear un paquete de FamilyData, que tiene todo
el cdigo necesario para el manejo de los dominios que se necesitan por el
programa. Los mismos dominios estara disponible para el plomo en
clase familyData
abierto central
dominios
de gnero = femenino ( ) , macho ( ) .
dominios
persona = cadena.
person_list = persona * .
dominios
optionalPerson = noPerson ( ) ; persona ( persona Persona ) .
predicados
toGender :
gnero .
( cadena de GenderString )
predicados
toGenderString :
GenderString .
-> de gnero de
( de gnero de gnero )
-> string
predicados
ClassInfo : ncleo :: ClassInfo .
fin de la clase familyData
Si te fijas, la clase anterior contiene las definiciones de dominio que van a
ser compartidos entre varias clases. Por lo tanto, el propsito de este
paquete es actuar como un lugar de reunin entre la capa de datos y
la capa de negocios .
Interfaces
La capa , que se encargar de los datos, ser a travs de los objetos
creados a partir de una clase en el paquete de FamilyDL.Sin embargo,
antes de llegar a los contenidos reales de dicho paquete, tenemos que
entender un concepto llamado de una interfaz .
Una interfaz puede ser visto como una declaracin de intenciones sobre qu
esperar en los objetos que se adhieren a la interfaz, dijo. Est escrito en un
archivo separado utilizando el IDE y puede contener predicados que se
pueden esperar ser encontrado en los objetos de una clase.
Una interfaz tambin puede ser utilizado para las definiciones de algunos
ms que no se explican en este tutorial. Usted puede aprender sobre el uso
de los avance en un tutorial futuro.
La razn para escribir las intenciones por separado en una interfaz diferente
es una una elegante: Una clase puede ser escrito para adherirse a las
declaraciones se encuentran en una interfaz. La interfaz ofrece una
definicin abstracta de la funcionalidad proporcionada por los objetos de la
clase. La definicin es "abstracto", ya que slo expresa parte de la
funcionalidad de los objetos. En resumen, una clase de forma declarativa se
puede afirmar que los objetos se comportan de acuerdo a la interfaz.
Varias clases pueden implementar la misma interfaz, cada uno de ellos
proporcionando un especfico y concreto (es decir, no abstracto) la
aplicacin de la abstraccin. Esto reduce la carga de mantenimiento del
cdigo enormemente. Ms tarde, cuando ms sofisticacin se va a
introducir en el mismo programa, el programador / s puede trabajar en
estas interfaces y luego trabajar su camino a partir de ah metdicamente.
El paquete de FamilyDL
Este ejemplo tambin contiene otro paquete llamado el paquete
FamilyDL. Este paquete contiene la clase principal, cuyos objetos se
ocupara de los datos reales.
Este paquete contiene una interfaz - la interfaz familydl. El propsito
principal de este interfaz es definir los predicados que son proporcionados
por la capa de datos a la capa de lgica de negocios. Como tal, juega un
papel importante en la capa de datos. Esta interfaz se basa en los dominios
del paquete FamilyData.
interfaz de familyDL
abierto central, familyData
predicados
person_nd : ( persona Nombre ) nondeterm ( o ) .
predicados
de gnero : ( persona que nombre ) -> de gnero de gnero .
predicados
parent_nd : (
persona persona ,
persona de Padres )
nondeterm ( i, o ) .
predicados
addPerson : ( persona persona , el gnero de gnero ) .
predicados
addParent : ( persona persona , persona de Padres ) .
predicados
personExists : ( persona Persona ) determ .
predicados
salvar a : ( ) .
finales de interfaz familyDL
En el cdigo anterior, la palabra clave abierto se utiliza para indicar que las
declaraciones tanto en el ncleo y los paquetes familyData se utilizan en
esta interfaz.
El paquete contiene dos clases: family_exception y family_factfile. La
mayor parte del trabajo ser realizado por family_factfile .Ese archivo
contendr el cdigo, lo que trae en el pescado (si se fuera a utilizar de
nuevo la metfora del proverbio chino se mencion al principio de este
tutorial). Se crea sistemticamente la base de datos que es utilizado por el
programa, y, al hacerlo, as que comprueba para cualquier situacin de
error que puede ocurrir. En caso de que haya un error, sera utilizar los
predicados de la clase family_exception para sealar el error de forma
sistemtica.
...
interfaz de familyBL
abierto central, familyData
predicados
personWithFather_nd : ( persona persona , persona Padre )
nondeterm ( O, O ) .
predicados
personWithGrandfather_nd : ( persona persona , persona Abuelo
)
nondeterm ( O, O ) .
predicados
ancestor_nd : ( persona persona , persona que los antepasados
)
nondeterm ( i, o ) .
predicados
Conclusin
En este tutorial se utiliz una estrategia de " ensear a la pesca del
programa y no darle el pescado "en nuestro programa. Esto no es sino
modularizacin del cdigo fuente del software inteligente para que el
mantenimiento del cdigo y la extensin del cdigo se convierte en
extremadamente simple. Nos separamos de la capa de negocios antiguo del
tutorial anterior en dos partes: una lgica contenida negocio puro y el otro
maneja slo los datos. Esto nos permite extender el programa ms tarde y
simplemente reemplazar la capa de datos con otras formas de tcnicas de
manejo de datos (por ejemplo, a travs de los datos obtenidos a travs de
un protocolo ODBC, oa travs de Internet, etc) Este tutorial tambin el
manejo cubierta excepcin y descubrimos que , lo fcil que es escribir
nuestra propia excepcin elevar los predicados, y las usar para mostrar
mensajes de error inteligentes para el usuario.