POYECTO DE I NVESTI GACI /' VERIFICACION FORMAL …148.206.53.84/tesiuami/UAM8305.pdf · resuelta...
Transcript of POYECTO DE I NVESTI GACI /' VERIFICACION FORMAL …148.206.53.84/tesiuami/UAM8305.pdf · resuelta...
UNIVEXSiDAD AüiOMOXA WETROPOLITANA
UNIDAD IZTAPALAPA
POYECTO DE I NVESTI GACI 6N
/' VERIFICACION FORMAL DE ALGORITMOS
Asesor3 Roberto Solis O b .
Realizado pro: Jorge AibrtoCEc_cheverry -a.
Matricula X 84227714,
I
h x i c o D. F., 22 & junio d9 f984.
El objetivo
herramientas que
al gori tnor .
de este proyecto 85 desarrollar
ayuden a la verificación formal de
. . ... “ -,. .
I
!
E l computador es una herramienta poderosa, que pormite
rea l i z a r con f a c i l i d a d un gran nhraro de tareas, que de
o t ro modo ser ían tediosas o d i f i c i l e s de r ea l i z a r . La
elaboracidn de los algoritmos que permiten a los usuarios de
computadores ayudar a resolver sus problemas; es una tarea
rea l izada por l o s diseñadores de software.
De fundamental importancia et que el software
desarro l lado para l a solucibn de una tarea no tenga errores,
es decir que cualquier instancia del problema debe ser
resue l ta por el software y por consiguiente l a s soluciones
emitidos por este deben ser siempre correctas.
- - Actualmente para probar un algoritmo l o que normalmente
se hace es dar un conjunto de entradas a l programa y
vierificar que su comportamiento sea el esperadoresto da a l
disoflador c i e r t a confianza en 'su producto, poro de ninguna
manera p u d e afirmar que su programa es correcto, porque p u d e existir un caso de entrada no probado por el, para el cual el algoritmo no da la respuesta deseada.
En la mayor parte de las ocasiones el nilnaero de
instancias de un problema en part icu lar es demasiado grande,
dm tal manera que el disgPTador no puede probar con cada una
do estas como entrada a su programa, y a s í dospub de probar solaniante algunos casos, si en todos ellos el
programa llegó a l a solucibn, supone quo su producto os
correcto y l o hace llogar a los usuarios.
1
Programas probados de esta forma son poco confiables y
con relatiuva frecuencia los usuarios detectan fa l las en el
programa, es decir descubren que este no se comporta en l a
manera esperada. En algunas ocasiones l a respuesta a l a
instancia del problema no es la. deseada y en algunas otras
simplemente el programa no l lega a ninguna solución pues
entra en un c ic lo del cual no puede sa l i r .
Surge entonces l a necesidad de contar con un metodo
formal que pueda decidir s i si programa creado cumple o no
con las especificaciones pedidas por al usuario. Y mejor que
eso ser ía contar con un metodo de diseño que permita l a
construcción de programas correctos.
Algunos investigadores, especialmente HOARE y DIJKSTRA, han estudiado este problema, y han propuesto &todos para
que dado un algoritmo, las especificaciones de entrada bajo
l as cuales el algoritmo implementado ejecutará y l a
especi f i caci ón de 1 a sal i da esperada par a cual qui er
instancia del problema de entrada, sea posible decidir s i
tal algoritmo puede siempre dar l a solución correcta o no.
En este momento es importante mencionar que demostrar
la corrección do un algoritmo involucra: demostrar que para
cualquier entrada valida,. el algoritmo terminará su
ejecución en tiempo finito. Este problema se sabe es
IWDECIDIBLE, por tanto los métodos de HOARE y DIJKSTRA trabajan bajo l a suposición do que el algoritmo quo está
analizándose terminará en tiempo f i n i t o siempre. Se dice
entonces que los métodos de HOARE ó DIJKSTRA solo pueden
probar l a correccibn parcial de un algoritmo, esta es que
para cualquier entrada valida, l a salida es l a correcta>.
I
cona0 decidir si un algoritmo termina en un tiempo finito
es un problema sin solución algorltmica, entonces no se
puede demostrar que un programa es totalmente correcto, por
io que en ci pi-wsenta proyecto nos encargaremos de dar-- algunas herramientas para l a ayuda a l a VERIFICACIW FORHAL
DE UN PROGRAMA Cverificación parcial de estd.
3
DESARROLLO TEORICO
VERIFICACIóW FORJrUL DE UN ALGORiTMO
Para l a ver i f i cac ión de los programas simples, que
u t i l i z an las estructuras de control t a l e s como:
seleccidn, iteracibn condicional y secuenciación,
se usan dos thcnicas básicas. una .usa regias de inferencia
del cá lcu lo proposicianal desarro l lada por d. d. d. 3emm.e. y
l a otra usa transformaciones de predicados deducida por 8.
W. ;DC,j&Wm. Presentaremos a continuación los fundamentos de
estas t k n i cas, haci endo 4nf asi c; en el si sterna axiomáti to de
Hoar e.
COKEPTOS BASICOS:
Primero se introduciran algunos conceptos que se usaran
en 1 os párra fos si gui entes :
Llamaremos Precondicíón a l estado de un programa antes
de ejecutar una propoficih.
Usaremos el tórmino d e pottcondicibn a l estado de un
programa d e s p u b d e e3ecut.u una proposición.
La notacih iP)SiQ): expresa l a CORRECTEZ condicional
de S con respecto a l a precondición P y postcondición Q,
asumiendo que l a precondición P garantiza l a t e rminac ih de
S.
R i m e r o consideremos las precondiciones deb i l e s de S con
respecto a Q, denotadas por WPCS,Q>; esto es el predicado
que dcscribe todos los estados i n í c i a l e s para l a ejecución
4
. . . _.......-- "-,. ". _...__l/.. , . , _,_". Ll.." .._+_ . . , ___I_LI_... . ". _._ ... 1_-1 I,..... ".... .
de S, que garantizan que termina sat is factoriamente en un
estado de Q.
Aquí se pueden ver 2 casos que se presentan para
confusión:
a. Cuando l a proposición de S garant iza de antemano que se
l lega a cualquier estado f i n a l de l a postcondición Q
satisfactoriamente s i n importar WPCS,Q>: Por ejemplo:
WPCi:=O,i=O> = Verdad.
b. E l caso contrar io cuando la ejecución de l a proposición
S implica que nunca se va a Larminar satisfactoriamente
en un estado f i n a l de í3 s i n i m p o r t a r WPCS,Q>: Por e j empl o
WPCi: =O,i=13 = Falso.
REGLAS DE CONSECUENCIA: Son llamadas así a las reglas de
y SB deducen a partir de l a estructura del programa.
Asumimos que CP)SCQ) es vá l ido . Primero consideremos una
postcondici6n Q' mis dtbbil que .La postcondicidn Q Cporque Q'
contiene a Q y otros estados>. Si P garantiza a l terminar S
que el estado S satisface Q. Claramente a l terminar S, el
estado S satisface Q ' ; porque todo estado de Q es estado de
€2'.
Ahora consideremos una precondición P'más ftnrte quo la precondici6n P Cporque P' ccuitiene -nos estados que P9.
Cualquier estado que satisface P' s a t i s f a c e P. Entonces
cualquier estado S qum garantiza l a postcondicibn Q y
satisface P' ; también satisface P.
P 2 Q Q > R CCD s C R ) CP> 5 CQ3
CP) s <a C P ) s C R )
Condiciones d e 2MJblrUL: Estudia l a combinación entre
las constantes l óg i cas FALSO, Y VERDRD y los operadores
ldgicos Y ó O. Para esto primero redefiniremos WPCS,FALSO3; esto descr ibe ningún estado en l a postcondición; y
WPCS,V€RDAD3 , describe todos los estados de l a
postcondi ci án.
UPC S . FALSO3 < => FALSO WPCS,VERDAD3 < => VERDAD.
Tambi Bn 1 a precondi c i ón debi 1 cumple 1 as s igu i entes
propi edades :
a. WPCS,Q & B <=> WPCS,Q3 & WP CS.R3.
b. WPCS,Q ó R3 <=> WPCS,Q3 ó WPCS,R3.
c. WPCS,NO Q3 <=> NO WP C S , D .
SISTEMA AXIOMATIC0 HOARE
Ahora empezaremos nuestro estudio con los tipos de
programa más s en c i l l o s que son los programas s i n c i c l o s .
Veremos las reglas que hay entre l a precondici&nr l a
proposici6n y l a postcondici&n.
AXZOMA DG ASIGNACI6N: Consideremos l a ai ignacibn x: =e?
y l a postcondición QCxJ Nosotros queremos garantizar QCx>
dmspu- do asignar a x: =s. Esto l o hace WPCx: =e, QCx3í.
--
wPcx:=e,Qcx33 <=> Qce3.
La pruondicit5n debo garantizar que l a expresión "e"
está bion dof in ida . Por ejemplo i/j* no está b ien def in ida on
el caso J'*; ó. aiii tampoco está b ien de f in ida en el caso
en quo i est+ fue ra do l a dimmnsión do a.
Los tipos de x y e deben ser i gua les ; porque no es
permitido l a asignación de un entero a un booleano 6
elsmontos de d i f e r en te tipo.
C o M p o m C I - SECUENCIAL: consideremos a Si; 52 que
garantizan un estado s a t i s f a c t o r i o para Q. Notemos que l a
precondición WPCS2,C;n garantiza un estado s a t i s f a c t o r i o para
Q, y como WPCS2,Q> es l a postcondición de la proposición Si,
entonces un estado Sa t i s f ac to r i o s debe sa t i s f ace r WP
-
c s1; 52, Q3.
wPcs1;s2,w <=> wpCS?,WCcXt:.S33. Para un predicado
arbi t.rario Q.
REGLA LA COMPC6iCION SECüENCIAL: Suoniendo que l a
ejecución de S I con l a precondición P garant iza l a
postcondición R; y ejecutando S2 con l a precondición R garantiza l a postcondición Q; entonces Si; 52 con l a
precondición P garant iza l a postcondición Q.
Aplicando l a Reelor Sectwncial sobre l a última
proposicibti 5 , luego al penúltimo y así sucesivamente
Fade= obtener proposiciones de l a forma C s )
Si;S2;53;. . . ;Sr iQ).
SGLECCZON: S ~ ~ O ~ ~ J I I O S que Q es una postcondición de B ENTONCES S1 OTRO S2. Donde B BE una expresi6n Booleana que
-garant iza Q d e s p u b de ejecutar S I 6 52. Sí se eJecuta S I el
estado de las variables del programa antes d e eJecutarse B debe desc r i b i r s e por WPCSI,Q>, l a p rocond i c i h debo
garantizar Q.
B => WPCSZ,Q>.
Ahora supongamos que es ejecutado 52. Esta debe
garantizar el estado satisfactorio de Q y el estado de las
variables del programa debe satisfacer WPCS2,Gu.
NO B => WPCS2,Q).
Entonces uniendo las 2 ecuaciones tenemos:
. WPCS1 B ENTONCES S1 OTRO S2,GD
<=>CB => WPCSl,Q>> Y CNO B => WCS2,Q33.
Tambih se puede e s c r i b i r :
WPCSI B ENTONCES Si OTRO S2,D
<=> CB Y WPCS1,Q)í ó CNO B Y WPCS2,mí.
REGLA SELECCIm-: - Las 2 reglas que describen l a
se lecc ión son las s iguientes:
Si podemos probar: P y B describen los estados antes de
eljecutar S1, y Q descr ibe el estado despub de e j ecu ta r l o y
t - h i + n , si P y NO B descr ibe los estados antes de e jecutar
S2, y Q describe el estado despub de ejecutar 52. Entonces
podemos deducir que si P descr ibo el estado antes de
e jecutar B EEJrobJ CES S1 OTRO 52, entonces Q describe el
estado despuós de e jecutar lo .
cs Y Q3 s1 im. iP Y CNO B 33 52 CQ3
<P) B ENTONCES 51 OTRO 52 i C D
Si podemos probar que: Si P Y 8 describen los estados
antes de eljecutar S, y Q descr ibe el estado después d e
eJecutar10. y si P y NO B implican Q. Entonces podemos
c
decir : Si P y B describen 104 estados antes de ejecutar SI: B ENTONCES S, Q descr ibe el estado dospues de e jecutar lo .
CP Y 83 S CQ)
P Y CNO 83 => Q
C P ) B ENTONCES iQ>
b a aquí podemos deducir el s iguiente teorema:
P denota CB => WPCSl,Q>3 Y <NO B => WPCSs,Q33 Entonces:
a. CP> B ENTONCES S1 OTRO 52 CQ>. b. Si Sí y 52 siempre terminan entonces:
<R) L) ENTONCES Sí OTRO S2 CQ) IMPLICA R => Q.
Ahora analizaremos los programas con c i c l o s , para estos
se cumple una condición que explicaremos en el s iguiente
parrafo, que ea muy importante en l a ver i f i cac ión del c i c l o .
INVARIANTES E INDUCCI6& El rezonamiento sobre l a - induccibn se hace a base de conjeturas a pa r t i r de un número lid tado de observaciones experimentales; para hacer l a s
domostr aci ones.
IWARIANTE es el su je to que 8s materia de l a sugestibn,
que no cambia;’ parad6jicamente cosas sommjante siempre
cambian rápidameente. Para el humano las cosas XNVARI-
so conocen como PAIIONXS; y algunas pruebas de inte l igencia
t ratan esto. Ejemplo: s:d ;
PARA i : = 1 HASiA La XNVARIAN~ de
I elementos a t i I ,at23,.
n HAGA E: s + a t í l ;
la proposición, s es la suma de los . a r i l antes de incrementar i .
Razonamiento Inductivo: Este proceso por el cual
inferimos una propiedad invariante de un conjunto de I
obfervaciones. E l razonamiento inductivo procede de l a
conjetura a l a observaci6n y a l a demostraci6n. Por ejemplo
observamos que 1 +3=4, 1 +3+5=9, I +3+5+7=18; reconocemos el
FATR6N y hacemos l a conjetura 1+3+5+. . . +CSm-l3=m‘.
Domostración p o ~ Inducci6n: - Para demostrar las
conjeturas nmtenzdticas existe el p r inc ip io d e inducción
matemática. Esta normalmente nnvolucra un PREDICIOO PCn3,
con un número natural n.
E j empl o:
FYn3: 0+1+2+3+4+. . . +n = nCn+l)/% es un PREDICADO.
La esencia del p r inc ip io de induccidn matemática
Csimple3 es que PCn> es VERDADERO para todos los naturales ,
si es posible probar:
a. K O > es VERDADERO. Cbase de l a demostraci6n3
b. Si PCn3 es V ~ D A D U O entonces P Cn+l3 es VPIDADERO.
Cpaso de i nducci ón3.
Intuitivamente el pr inc ip io de inducción es simple,
dertpués dm tener estab lec ido el paso de induccidn conocemos
en part icu lar que:
K O 3 => PC13 por el jxso inductivo
Pc 03
PC13 por Modus poneni
PCI3 => FK23 por el paso inductivo
PC13
Pc23 por Modus ponens
Con esto pudo ver íntuiti-mente que todos los KO>, XI>, PC23,. - . son ~ D A D S R O I E .
El pr inc ip io tambih l o puedo usar cuando m I n l p
entonces se debe probar. a. Pía es ~ D A D ~ O . base del principio3
10
b. Si m I n < p y PCn3 es VLIIDADERO entonces pCn+í3 es
~ D A D E R O para m I n I p.
Una variación si gni f í cati va en el p r inc ip io de i nducci ón
matemática es 11 amada PRIACí ?IO DE INDUCCION FWERiE. Cuando
usamos este p r inc ip io en el paso inductivo asumimos PCk3
para toda kln. E l p r inc ip io dice:
Si tenemor un predicado PCn3 sobre todos los naturales
entonces.
a. PCO3 es VLRDADLRO.
b. Asumiendo que PCO3, PCl3, PC23,. . . , PCn3 son V ~ D A D E R O S
entonces P Cn+li es YSRDADERO.
Recordemos ahora 2 def in ic iones importantes acerca C P ) S
C C D y de la precondición más débi l WPCS,CD: CP,SCQ) si
ejecutamos S apartir de un estado i n i c i a l P y si S termina
entonces draspuds de e jecutar S se satisface el estado Q.
wpCS,GD es el conjunto de todos los estados i n i c i a l e s
que garantizan la torminacidn de S en un estado que
satisface Q.
Cuando decimos que l a demostración de C P ) S €Q) es una
demostración de l a CORRlCCCION CONDfcIONAL, OT d w i r en l a
domostración S encuentra l a especificación, asumiendo su
trrminacibn; mientras quo l a demostración de P=>lypcS,dD es
l a dmmostración d e l a COIIRRCCION do S, es decir en l a
domostración S, encuentra l a espoci f icac i6n y sisntpre
tmrmina.
EJ. c r i t e r i o para terminar es l a base de una formulación
inductiva
w m A S , para l a precondicibn más deb i l en l a proposición
para programas con ciclos.
11
Ahora profundizaremos un poco con los programas con
ciclos Cque usan l a estructura de control MIFATRAS B HAGA
=.Para los programas s i n c i c l o s cuando se d e f i n i d WCS,Qi
asumíamos que S terminaba. Ahora para de f i n i r MIENTRAS WPCS,@ tenemos que garantizar que S va a terminar; cuando
demostramos para el c i c l o MIENTRAS P => WPCS,CD demostramos
l a commrccxoN de S , cuando S encuentra su especi f icac ión y
siempre termina.
Vamos a llamar a l a proposición MIENTRAS W y al cuerpo
del c i c l o S. Entonces si W va a terminar entonces S se
ejecuta un niimero f i n i t o de veces 0,1,2,3 veces etc. Vamos a
usar a K para contar el nirmero de i teraciones del cuerpo del
c i c l o antes que termine con un razonamiento inductivo.
Analicemos l a regla con un ejemplo concreto Consideremos
l a proposición MiEJ4iRAS I<>N HAGA EMPIEZA x=r+i ; s=s+r 'IERMINA con respecto a l a postcondición s=N(N+~>/z.
CO> Si lcro entonces i= N y l a postcondición Q debe ser sat is fecha automáticamente. La precondición es:
PtO> => íI=N> Y (8=N(N+i>/2>
C l > Si k=i entonces ejecutar W es equivalente a e jecutar S
dml estado en el cual ION. La postcondición es Q U
(s=N>, s nunca es ejecutada despues, que nosotros
u b s e r ~ m o s para sor PCOL
pU2 => QON> Y WPC se PCO>>. => UON> Y €ISN-f> Y <O+f*i=N(N+á>/Z).
=> (1zN-D Y íI=:(N-í>N/t>.
C 2 3 Si K* entonces ejecutar W es equivalente a eJecutar S 2
-os. El estado i n i c i a l dmbe sat is facwr iaa condicionos:
a.- ION
b. -Wpu&s de una ejecuci6n de 5, ION.
c . - EkspueS de 2 ejecuciones de S, X=N, s=N(W+í>/t.
Ahora vlmndo cuidadosamente sobro C l > uno nota que a , b
12
pueden ser combinadas dentro d e una condición despues de
e jecutar una vez l a condici6n P w t iene . Pa> => ( I O N > Y WPCS,Pí3
=> <ION> Y <f=N-Z> Y <S=<N-t><N-á>/2>
=> íi=N-2> Y <S=(N-2>C N-í>/2>.
Ck3 E l patr6n ahora es claro para l a condición P<k>.
P<K> => <I=N-K) Y íS=(N-KWN-K->/1D.
=> (1SN-K) Y <S=f<I+l>/Z>.
Pero PCK) es l a condicidn con l a cual nosotros garantizamos Q despues de e jecutar exactamente k veces S.
Par a genet al i zar :
WPC w, S=N<N+l>/Z> => EC K: KZO: <I=N-K>> Y (S=N<N+í>/Z>.
Consideremos a MfENTRAS 13 HAGAS con respecto a l a
postcondi ci 6n Q.
Entonces nosotros podemos ca lcu la r las siguientes
precondi ci ones.
P(o> => CNO í33 Y Q.
Pci> => 8 y WPC S , Pto>3.
Pcu => 8 Y WPCS,Pw3.
P<K) => B Y cs,PUC-i>>.
Ahora aparenta ser que l a WPCW,CD puede ser explicada
por 2 predicados.
r.-Una condición para terminar con 01 c i c l o .
b. -Una condi ci ón i nvar i ante.
La condición para quo l a procondición garant ice l a
terminación do S on cualquier estado para el caso en que s
s u os WPCS,V~~~~AD>; y esto es ident ic0 a WPCW,NO B 3 ; porque
W termina
Cuando decimos I es invar ianate de MiENiRAS B HAGA S es
que S es ejecutado con precondicion I al terminar S entonces
i dobo sor l a portcondici6n garantizada. Poro WPCS,I>
1 3
garantizará l a postcondición I.
1 Y B Y WPCS,VERDAD~ => WPCS,i>
Como antes def in id <P)SCQ) corm l a demostración de l a
comrcctoN de S con respecto a P y Q asumiendo su
tormi naci 6n ; Formal niente:
iP)SCQ) <=> CP Y WPCS,VERDAD> => WPCS,Q3>.
Entonces si I no cambia por l a ejecución de MIENTRAS B HAGA 5 , La r e g l a l a podemos formular de l a siguienteforma:
C i Y B ) S < I 3
€1) MIJZNTRAS B HAGA S C I Y CNO B>> iECREMA: Supongamos quo i y WPCS,vrro~so> => W P C S , I 3 entonces
i y WPCW.1 yCN0 B3í. La demostracibn es por induccci6n sobre el nQmero de
voces que se ejecuta el c ic lo . Se demuestra: *
f y p<ICXVmDAD> => PcK>cI Y CNO mD
donde P(oKQ3 <=> Q Y C N O B 3 ;
Pck>CQ)<=> B Y WPCS,P<k-I>C(;U.
a. k m PCO> <VIIDAD> <=> 1 Y VÍRDAD Y CNO B>
<=> CNO L?3 Y I Y CNO B3
<=> PtoKf Y CNO f33
b. Por H.1.se cumple para k.
P&XV&=> PfkK1 Y CNO B)> c-Por demostrar para KM:
f Y PCK+i> < => I Y 8 Y WPC SS P<KnVrrDAD>>
<=>B Y f Y B Y WFKS,Pa> t v r n ~ m 0 3
<=>8 Y f Y B Y W P C S , V ~ ~ A D > Y WPCS,Pac>>
+ B Y wpCS,I> Y WPCS,P<K> (V=DAD>>
<=> B Y WPCS, I Y PCKXV~LRDAD>~ =>B Y wpCS,I Y CNO B33
Entoncos I Y WPCW, VUDAD> < => I Y 3Cw.rtLO: P<)rxvera>
<=> 3CtcrLO: I Y P<KHV~RDAD>~
=> Xmc>O:p(~> C I Y CNO B33
<=> wpCW,I Y CNO 83)
14
Cuando nosotros preguntamos por l a CORRECCXON de un
algoritmo, queremos hacer l a demostración paso por paso?
definimos l o que es l a tabla de demostración: es una
secuencia ytermina con una aserción. La tabla es válida s i :
9.- Siempre que ocurre las aserciones CP)SCQ> enla Labla SE
una pr oposi ci ón VERDADICPLA.
b.- Siempre que Ocurre el par <F)CQ> en l a tabla l a aserción
P implica l a aserci6n Q.
Según l a definicibn de l a tabla esta puede variar mucho
dependiendo del detalle que p r o d . una tabla en l a cual
solamente hay assrcionss al inicio y a l final del programa
es s i mpl eniente una proposi ci 6n condi ci onal de 1 a CORRECCION
del código que contiene. El otro extremo es una tabla donde
este totalmente intercalada cada proposicibn con
aserciones.El intermedio de estos extremos es una tabla con
aserciones en los puntos importantes, por ejemplo.
<O<K Y I C Y , 5 , K > > : I C Y ? B ? K > <4 C raKI xN > SJ: P M K 3 ENTONCES EMPIEZA :9anCK3 <-> 2- para n 6i IN
<p&k> y O<K Y I c Y , 5 , K > >
Y=K/2
KPY-I
Cuando el programa contiene cilos es importante anotar
on cada ciclo l a propiedad invariante de este, en otro caso
so requ ie re mucho ingenio para verificar el algoritmo . €1: Proporicion invariante)
Mientras B Haaa
<I y B)
S
€13
<I Y NO B) Una demostración completa es muy grande e innecesaria en
el nive l de d e t a l l e que proved.
Consideremos un segmento de programa S con precondición
P y postcondición Q, respectivamente. Una precondición
PRECS,Q> y dos conjuntos condicionales de ver i f i cac ión
V'CS,GD y VCP,S,@ que son construidos a partir de P,S,Q. en
l a s igu iente forma:
o.- Si 5 es l a asignacibn %=e entonces PRECS,CD y
V'CS,rn SOX1 WKS,#.
b.-Si S tienen l a forma Si, S2 entonces PRECS,@ es
PRECSl,PREC52,Gn> y V'CS,Q es l a unidn de V'CSl,PRECSl,CD3 y
V'CS1 ,Q>.
c.-Si S toma l a forma 8 ENTONCES Sí OTRO 52 entonces
PRECS,Q> of CB y PRECSl,CD> o CNO B y PRECS2,GDD y V'CS,#
os Ir union VsCSl,Gn y VsCS2,GD.
d . -S S t i en e l a forma MiENTaAs B HAGA Sl e I es l a
propiedad invar iante del ciclo entonces PRECS,GD es 1 y V'CS,Q) es la uni&n d e VCi y B,SI ,a3 y l a condici&n C f y
NO B) => Q.
e.-& todos los casos VCP,S,GD os l a union de V'CS,Q) y
l a condición P=> PRECS,43.
Las funciones PRECS,D,V'CS,GD y VCP,S,Cü son descr i tas
por los s iguientes predicados:
C p I 3 . Si todas las condiciones do verification en elconjunto
18
V' CS, dl) son val idas entonces S es condicional mente
correcto con respecto a l a precondicion PRECS,@.
CP23. Si todas las condiciones de ver i f i cac ion del conjunto
VCP,S,GD son va l idas entoncos S es condicionalniente
correcto con respecto a l a precondicion P y
postcondi c i on Q.
REDUCCION DE EXPRESIONES
GRAFICAS ACICLICAS DIRIGIDAS CD. A. G. ir Es una estructura de datos ut i l i zadapor los compiladores
para eliminar codigo redundante, un D . A . G . a d i fe renc ia de
un a r b 1 puede tener nodos internos o externos apuntados
otros nodos.
Un D. A. G. se construye dependiendo de l o s requerimientos
del problema, el D . A . G . de optimización u t i l i z ado por los
compiladores es diferente a l D. A.G.que se u t i l i z a para hacer
oliminacón de expresiones, porque l o s objetivoss del
problema son d i fe rentes .
Un D. A. G. tiene l a f a c i l i d ad do poder sor construida en
una tabla de memoria, en l a quo podemos hacer una gran
variedad de recorr idos por ejemplo: r eco r r i do secuencial,
previo, por nive les .
En el s igu iente elemplo se mostrara gráficamente como
esta construido un D.A.G. y cual es su representación en l a
tab1 a.
8
Expresión en el árbol binario
Expresí6n en el D. A. G.
I I a & 2
B
5
Q I--:- O O
- - <
+ 6 7
I O I O I ' I O I o b
D. A. G almacenado en l a tabla.
Se u t i l i z a r á el D.A.G. para deteciar y eliminar
subexpresi on- comunes medí ante un algor i t m o de r educci 6n
a r i t d t i c a y l óg i ca haciendo un recor r ido simetrico del
D. A. G. , el cual se f a c i l i t a si el D. A. G. es almacenado en un
tab1 a.
REDWCION DE iPfPLiCACIONES DE L A FORMA OBTENIDA EN LAS
COUDl GI ONES DE VERI Ff CACi O.
Di señamos un a l gori t m o par a si mpl i f i car i mpl i caci ones
al cual denominamos REDuIL;CION DE CONSECUENTE.
Esto es un motodo ORIGIMAL desarro l lado para l a
demostracibn de las formulas del tipo C A 4 B3, esta tíacnica
consiste en ap l i ca r repetidamente el s iguiente teorema:
CCA & B3 -> CE F’33 <+ C C A & B3 > F > & C A -> E3
El teorema anterior es apl icado si tanto el antecedente
como consecuente son l a conjunción de var ios terminos.
1\1&&&h& . . . & A n -’ ’í&T2& .... 81Tn.
Para poder domostrar l a i m p l i c a c i h se toma cada
c láusula de l a izquierda y se revisa quo cláusulas del
consicuente son implicadas por ellas, esas cláusulas son
eliminadas dol consecuente.
Si el antecedente es ladisyunción de 2 o más terminos.
X i Y‘ X t V XO v . . . ’ Y X n
ESntoncos el teorema se debe aplicar a l a conjucibn de
cada uno do =tor subterminos C X U con los terminos
dol consocuonte, esto so j u s t i f i c a pot el s iguiente toorema:
A & CB v C> < \ C A P B> v C A & C3
RELACION CON LA VERiFiCACfON:
En l a verificacibn de programas, como ya vimos
anteriormente se presentan ciertas condiciones de
verificacihn que son un poco gran cuales se trataran
de demostrar en total o parcial ma autanatica, y
asi dar al usuario más herramie ayuden en l a
tarea de verificar un algoritmo.
E l D. A. G. proporciona l a vent que si guardamos una
expresión en esta estructura 1 gules no se
repiten, por l o que es relati l o detectarlas y
hacer reducciones de tipo a algunos casos de
tipo logico. Este trabajo se
ventajas que da el guardar el D.A. en una tabla. por l o
que seria de mucha importacnc
estrtuctura y asi reducirla.
El metodo de REDUCCIOEI DE C CUENi€ t iene l a gran
ventaja que se p u d e demostra te una implicación
y psi si l a comprobaci6n no domostración.
Es muy importante aplicar l a CiON DE COEECUENiE para 1a VERIFICACION FORMAL DE AL porque las
condiciones de vmrificaci6n que son la forma: A -> B
y tione l a paricularidad quo frecune te el antecedente y
01 consecuontm son l a conjun
que so puede demostrar l a condición o dejar al usuario que
l a demuestre ya bastante reducida.
A continuaci6n se da l a sintáxit de los algoritmos
aceptados por 01 VIEIU~~~CADOR.
<di gi to>: : =l U\3\4\5\8\7\8UW
(Qetra)): : =a%-\. . . h\ykL%\c\. . . kc\yW
<al f rnuaiór i co>x : =<a otr a>>\<di gi to>>\<al f a n u d r i co>>
<Cv;zri ab1 e si mpl o>>: : =<Q etr a>X<el f anudri cos3
cmombr e»: : =<a et r a>X <el f a n ud r i COS>
<eigne)): : =+\- <edici6n>k : =+\-\OR
<and ti pl i cador >>: : =*\/WND cooper odor r enaci onal >: : =< \< =\=V \< > (4rnterow: : w a g i to>X<úentero>>>
cm6mw-o entero»: : =<cantero>>\<csigno>> <ú.ntero»
<QiCaaoros>>: : =caiicniero entero>>
<war i abl e>x : =<war i ab1 o si mpl o>% <caxpr esi ón si mpl o>>]
<ei dsnti f i cador >>: : =<antwo%\<amri ab1 e>> c a l ommto>x : =& denti f i cador >>U <caxpr eri ón»í <@actor si mpl e>>: : =<al einento>>\<csi gno>> <al emento>>
<@actor>. : =<(factor simplo>>WOc~actor simplo>>
<&ormino»: : YcfactorMmul tipicadors <&actor>>>
cmxpr esi ón si mpl e)): : =<&ormi nolX <cadi ci -> <&er m i no>>> <axptosi ón»: : M-resi ón si -1 e>>
t GQprr adw r 01 aci onal %é*xpr osi ón si -1 r>>l
-si gnaci un si m p l e»: : m r i abi o>)iccaxpresi bri»
(6.1 occi : a <axprmsi ón>> B"-*oposi ci o m s U i R O C ~ o p o s i c i o n w ~ N ~
~<mxprwsir5lm m-oposi ci onos»FI NS
atmrrcic5n condicional»: : = ' M i ~ ~ x p r e s i o n »
22
DESARROLLO EXPERiMENiAL
CroacióE Prourrma para Ver i f i ca r Parcialmente
unAlrioritmo:. -
Una vez rea l izada l a investigación teórica y def inida
l a ostructura s intáct ica del lenguaje que vamos a usar
Cestructura en BNF3, el s iguiente paso que realizamos fué determinar los axiomas, reg las y propiedades de l a
precondición más debí1 para poder ve r i f i c a r l a corrmctez
de un algoritmo a par t i r de una postcondición proporcionada
por el usuario.
ANALI Si S Si N T A m CO:
ET primer paso para l a automatización fué crear un
programa que h ic ie ra el análisis: s intáct ico del algoritmo,
esta program se div ide en 2 partes:
ANAL I Sí S L €XI CCGRAFI CU:
En l a primera parto se lem cada renglc5n on un buffer y
so anal iza caractor de izquierda a derecha identi f icando
cada t o b n del algoritmo fuonte que pueden ser :
ident i f icador , palabra r e i e rv lda ,nómero ,opador relaciona1
C<c =, C<, =, >># >)Q, <O>3 , operador aritmético C -, +. *, 4 bl anco,
punto y camP,corchote izquierdo, corchete derecho, error , f i n , commtario, paréntesis, izquierdo y paréntesis derecho.
Si en el anPilisit lexicográfíco se encuentra un error osto os almsircmrdo guardando l a posicibn Crenglónr columna>,
so interrumpe el aná l i s i s y so borra l a t ab l a de l i s t a s
l igadas pormitiendo a l usuario c o r r e g i r l o y volver a
oinprzar. Si estea aná l i s i s no detecta ningún error da como
24
resultado un apuntador a l f i n a l de l a t a b l a para que en l a
s iguiente par te del programa se f a c i l i t e l a verifi 'cación.
ANALISiS SIWACTICQ:
En l a segunda parte identi f icando el token se v e r i f i c a
que l a proposición sea estructuralmente correcta de acuerdo
con l a s in tax i s def in ida en BNF. Sí l a proposición no t iene
error se guarda en una tab la de l i s t a s l i gadas de acuerdo a l
t i p o de proposición: Si es una asignacibn guardamos l a
var iab le y l a expresión que se l e asigna a l a var iab le . s i es
una selección guardamos l a condición, un apuntador a l a
proposicidn CS í> cuando se cumple l a condición, un apuntador
a l a proposicic5n C-523 cuando no se cumple l a condicicjn y una
var iab le booleana que nos indica si l a proposición pertenece
a 51 6 S2;cuando l a proposición es un c i c l o guardamos l a
condición y un apunt.ador a 3 a proposición dentro del
cic1o;todas las proposiciones tienen un apuntador a l a
proposición s iguiente más externa, a l a anter io r , a l a
posterior y una va r i ab l e booleana que indica cuando l a
proposición está dentro de una seleccibn y está en l a parte
del otro.
ESTRCACTWRA DE DATOS:
los datos en esta parte de1,programa son almacenados de la s iguisnto forma:
1- El programa fuonte so ericuontro en un archivo tipo texto
do disco, es l e i d o por renglones CSTRING í8013 para
hacer o1 anal i a i s 1 oxi cograf i co.
2- En l a parte del a n a l i s i s s intact ico so genera una tabla
de listas ligadas donde hay 3 tipor: d f e nodos dependiendo
d m l l a p r w i c i t 5 n que se va almacenar:
a. Asignaci6n: t iono 2 cadenas para almacenar las
var iab le y l a expresit5n.
b.. Selección: consta d e una cadena para almacenar l a
condición; 2 apuntadores, uno a l a ultima proposición
cuando se cumple l a condición y otro tambien a l a
ultima proposici6n pero de l a parte del OTRO.
c . Cic lo : t i en e una cadena para guardar f a condición y
un apuntador a l a ultima proposición del cuerpo.
Todos los nodos t i ene 3 apuntadore: a l papa si son
parte del cuerpo de una proposición A s experna, al
hermano y al anter ior que son las proposiciones anterior
y posterior dentro del mismo nivel de profundidad.
\
-1 FI CACI ON:
RELACiON CON EL PROGRAMA De5 ANALiSiS STJ4TACTiCO:
l a re lac ión entre l a ver i f icac ión y el programa que hace
el ano l i s i s s intact ico esta en la tab la que almacena el
programa fuente puerto que es ta esta diseñada para
f a c i l i t a r el recorr ido da atraz hacia adelante necesario
para l a ver i f icac ión.
DISLÑO DEL PRotRAHA DE VERIFICACION: El siguiente paso f u e r ea l i z a r un programa que a pa r t i r
de una postcondi c i ón encontrará una pr econdi c i ón par a cada
proposici6n de un algoritmo para esto este programa debe
recorrer el alogoritmo de abajo hacia a r r i ba ut i l i zando l a
t ab l a generada en l a parte del aná l i s i s s intáctico. En cada
proposici6n dependiendo del tipo de es ta , encuentra l a
este tenga l a oportunidad de detener l a ver i f icac i6n si
precondicj 6n JI&S débil desplegandola a l usuario para que
encuentra algún e r ror ; cuando l a proposición 8s un c i c l o de
la siguiente forma:
c 13
Mientras B hoar Si
CQ)
Donde I es l a condici6n invariant- proporcionada por el
usuario; se necesita determinar el valor de VCSDAD de l a s iguiente condici6n da vorificoici6n:
i Y CNO ED => Q.
Cuando encuentra l a precondición de l o proposición
in te rn i del c i c l o .
i I 3
Hirntroi B haga C m 3 Si
av
S, necesita determinar el valor de VUDAD de l a
siguiente condición de verificación:
1 Y B => PI.
Debido a que se necesita una mayor interacción entre el
programa verificador y el usuario se l e integra al program
do verf icacih un editor que en l a primera parte se usará
para editar los algoritmos a verificar.
Cuando el usuar i o deter m i na cancel ar 1 a veri f i caci ón
esto implica que el programa qua verifLra hace eJecutar a l
oditor permitiendo la edición del programa para que su
modi f i caci ón sea i nmdi ata.
ESTRETURR DE DATOS:
Este programa esta solo requiere de l a tabla generada en
l a parte del anal.isis sintactico, solamente introduce las cadenas donde sa almacenan los conjuntos de verificación.
A continuación so da l a s in tax i s do las condiciones do
vvri f i c a d ón.
<di gi to>>: : =l ~ K 3 W ~ N U h O
<dotra>): : =a*k\. . . b\y'uk\*b\c\. . . 'uc\y\z c o l f anuuhr i CO>X : =<U etr a»\<Idi g i to>>\<ul f a n u d r i co>>
cWari ab1 e si nip1 ~ > k : =<U etr a>X<(irl f anumér i co>>> cmombr o>): : =<a ot r a>X <al f anum6r i COX+>
<esigno>): : =+\- <*dicid->: : =+\-\OR
<ouL ti pi i cador»: : =*- <doper ador r enaci onal >): : =< \< =\=V \< > <*ntor o>>: : =<di gi toM cantor o>>> cmúrnmr o entor o>): : qrritor o»>\<ei gnos <Ienter o>>
<múmrr os»: : =<(húmBr o enter o»
<War i ab1 o>>: : =<war i ob1 e si mpl e>X <cirxpr eoi 6n si nip1 es3
<cl dentí f i cador >X : =<6antoro>>\<cvar i ab1 o>>
c w p o c i al >>: : =TODOC <eMr i ab1 e si mpl e>> : <Qexpr esi on si mpl e>>
<-ridor r el aci onal >> <*xpr esi on si mpl o»
<* ador r el aci onail>> <*xpr m s i on si mpl e>> :
<*qx sobi on>>\ QCISIE<War i ab1 o si mpl o>> : <Qmpr eri on si mpl o>>
<QDpvrador r vl rci mal >> <Qipxpr esi on si mpl e>>
c4opor ador r el aci anal>> <Qnq# msi on si mpl e>> :
<dmprsosions\
~c~rr iablo simplo>% =SüWU<cvariablv simples :
a x p r mi on si mpl e>> <- ador r m1 aci onai >> C 0 X p r - i an si mpl ri>> <*per ador r el aci -1s
caxprvsion simplo>> :
Caxpr sosi on si mpi a» %
<al emonto)): : =<d denti f i cador >>U <~incpr eri <dPactor si mpl : -al ollwnto>>\<aigne> <o1 eaientm> <&actor»: : =<Cfactor si mplo»>WOc~actor si- e>>
\<-ped al >>
<&et- mi no>>: : =<(fat tor >Xmul ti pi cador >> Wac tor >>> c-xpr esi 6n si mpl e>>: : =<&tar mi no>C <&di ci ón>> <cter mi no>>> <-esi ón»: : =<cexpr esi bn s i mpl e>>
C enper ador r el aci onal >Xaaxpr esi 6n si mpl e>>]
REDUCCIQN DE CONDXCION DE VERXFXCACION:
Comm ya se nuonciono l a importancia de ve r i f i c a r 6
reducir l a s condiciones de ver i f icac ión, SSP van a diseñar 3
programas para este f i n :
Primero se de f in io l a s intax i s para l a s expresiones,
esta es basicamente l a misma que la def in ida para l a s
expresiones que se permiten en el algoritmo; solamente se
le introdujo cuantif icadores CUniversal , existencia13 y
expresiones de sumatorias C Definición en BNF 3.
PROGRAMA PARA LA GENERACiON DEL D . A . G . :
€l programa que hace el ana l i s i s s intact ico de l a
expresión u t i l i z a recursos ya croados como os el progarma
quo hace el an a l i s i s l ex icogra f i co ; para lograr l a
compatibilidad f u é necesario almacenar l a expresión en un
arroglo de cadenas de caracteres y as i solamente introducir
una parte en l a lectura del renglon CBUFFEB y una rut ina de
codi f i caci ón del token.
EL programa que hace el ana l i s i s s intact ico guarda l a
expresión en un D. A. G. Cuando el termino es una eicprasibn de
cuntiflcadoroms o smmtoria, se hace un llamado recursivo y
as1 generar el O. A.G. de esta parte para luego hacer l as
reducciones arimetica Creductor3 y finalmonte pasar lo a otro D. A. G. auxiliar donde so guardan cada una de l a s siguientes expresiones: expresión de los limites, l a expresibn
control C expresión que esta en d i o de l o s limited y l a
expr esi ón control ada.
3l
Para mayor f a c i l i d a d y eliminación de codigo redundante
se eliminan las operaciones de > y 2 por que estas pueden
SOT sust i tu idas por las operaciones de <, I, y =. Cuando el
operando es una R e s t a ó un NO l og ic0 se trata de eliminar
aplicando los s iguientes teoremas de las matematicas:
a. -C-A3 = A;
b. -CA + E3 = C - A 3 + C-B3
C. <A * B3 = C - A 3 * B d. -CA B3 = C - A 3 / B
l o mismo sucede con l a negacíc5n logica CNO3:
,
a. NOC A & B3 <-> NOCA3 Y NOCA3
b. NOC A Y B3 <-> NOCA3 & NOCB3
C. NOC A = B3 <-> CA <> B3; NCKA <>B3 <-> CA = B> d. NOC A < E> <+ CB I e. NOC A I B3 <-> CB < A3
Con esta p o l i t i c a so disminuye un poco el trabajo
de l a reducción; para poder toner las nogaciones se
introduce un campo más en e D. A. G. quo nos indique el estado de l a hoja.
PlBoGRAEIA REDCACTOR:
War voz generado el D.A.C. so pasa un apuntador de l a cabeza del D. A. G. a l reductor para que este baJe sobre
el mismo y haga reducciones basicas do 3 tipos:
1. Atitmaticat: a+O, a-, a%í* a/a, a-a; Apl ica l a l e y
asociativa para l a s u m C+,-3
y r e a l i z a todas las operaciones numoricas con 2 nodos y para l a m u l t i p l i c a c i h ;
hojas del mismo padre.
2. Relacionales: Reduce a un valor de vierdad si puede
determinar el valor de l a re lación: C a < a+-, C a > a d , donde x es cualquier numero y el operador puede ser
<, I , =, que son los que genera el s intact ico do esta
par to.
3. Las reducciones logicas en l a parte del reductor
solamonte se hacen con los operadores 'Logiccis
C 8 x Y 3 , :COD> y son basicamento para eliminar l a
redundaaciaaplicando los siguientes teoremas:
a. C A & M <+ A
b. CA N <-> A
C . C A 8r VERDAD) <- > A d. C A & FALSO> <-> FALSO
8. CA VERDAD3 <-> VERDAD
e. C A ! FALSO> <-> FALSO
f. CA&NOCCU> <4 FALSO
g. CA : N=N> <-> VERDAD
Debido a las r 'ostriccioner do memoria y como el reductor
en las operaciones que r e a l i z a genera y borra nodos,
entonces 'el nodo limpio dentro del D. A. G. se marca en campo
dol tipo; cuando se t ieno que recorrer secuencialniente l a
tabla para buscar un nodo part icu lar entonces se marca el
prinmr nodo libre para cuando si0 necesita un nodo nuovo.
Una vez hecha l a r d u c c i o n aritmetíca el D. A. G. es
compactado y se actual izan los apuntadores, esto para que
quede su f ic iente espacio a l a hora de reducir l a otra
oxprosión quo so hace d o ' l a mis- forma.
Cuando termina do reducir l a segunda oxpresicin antes de
conpactar el D . A . G . se debe -dar con el primer D.A .G . s i n
perder los apuntadores a1 i n i c i o de cada D. A. G. Esto 85 muy
33
-
Y 1 u-
importante para poder u t i l i z a r el &todo de EI.IMiNACION JX
-CIJENiE a l a hora de v e r i f i c a r l a implicacihn.
Lrr funci6n mas importante del programa reductor es hacer
las reducciones básicas mencionadas antes y hacer l a s
modificaciones del D. A. G. s i n a l t e r a r 5u consistencia.
PROGRAMA QUE DEMUESTRA LA IMPLICACION: Bgte programa se diseño para que, ut i l i zando el m&todo
o r i g ina l de REDUCCiON DE CONCECUEHTE, demuestre la condici6n
de ver i f i cac ión ; para lograr este fin r ec i be a l a entrada
los apuntadores a l i n i c i o de cada D.A.G.Cantecedente, y
consecuente>, el D. A. G. auxiliar y l a matriz de apuntadores
a este D. A. G.
Este programa esta diseñado para domostraciones de l a s
si gui entes for mas.
A & B V C ) - \ D
Donde A,B,C,D pueden s e r l a conjucihn de muchos t6rminos.
La priniera parte do domottraci6n es l a s iguiente
i m p l i c a c i h : .
Si esta demostración es completa entonces regresa un vaior de -dad, si l a domostracihn f u 6 parc ia l entonces so
guarda en un s t r i n g l a implicación reducida.
A' 4 D'
34
--- _x_ I
y se procede de l a misma forma para demostrk que:
B 4 D
C ---> D
Para cada una de estas reducciones se aplica el método
de l a misma forma, solaniente canbia el c r i t e r i o cuando l a
implicacibn es completa porque esto no demuestra C13
entonces simplemente esta parte no se pone en el resultado
f i n a l que es una cadena de caracteres para que el usuario
t r a t e de hacer l a demostracibn.
CA'-.>D'3 V CCB'->D'3 A CC'->D'33.
Ahora explicamos como hace el programa para demostrar
las implicaciones de l a forma:
Conro mencionamos anteriormente A y B son l a conjunción
de varios terminos:
CTI A TZ A To A . . . .Tn>-> CXS A X2 A . . . A Xm3
Entoncms el primer paso es hacer un conjunto Cno
ordenado> para el antecedente y otro para el consecuente. ,
Cada término so c l a s i f i c a dependiendo de l a re lac i6n de los
subt+rminoa; Cai3 de l a s iguiente forma:
-?.=u - a a I a2
- - € a 2
- VCpara todo>, 3 Cexiste3, Z CSUM>
ti estos términos no so divid-n en subtérminos.
luogo tomamos el conjunto del antocedente y l o dividimos
on los siguienter; conjuntos: $$,
- Conjunto de equivalencias de igualdades Cno ordenados>.
- Conjunto de equivalencias do menores C < í Cordenado3.
- Conjunto de equivalencia de menores i gua l e s Cordenado).
- Conjunto de especia les : en este conjunto se guardan los
tdrminos que son cuantif icadores o sumatorias. Todos estos conjuntos son DISYUNTOS.
Cada uno de los conjuntos de equivalencias son conjuntos
de conjuntos; y en cada conjunto Celemento> so guarda l a
re lac ión interna entre los subt6rminos. De esta form se
pudo crear una re lac i6n d i recta entre dos subtérminos que no
sean de l a misma rama, tambidn de esta forma se eliminan l o s
ter m i nos r edundantes.
Esta es l a estructura de datos necesarios para poder
ralizar l a demostración.
Luego SB toma cada elemento del cconjunto del
consecuente y depondiendo de que tipo de termino es, se
opera:
A3 Si es una igualdad y si los dos subtéminos están en un
conjunto Celemonto> de igualdad el termino del
consecuente so elimina porque se tiene:
ai = aj \ai = aj
Si l o anterior no so cumple. Entonces se buscan los dos
subtérminos en a l g h conjunto Celemento> dol conjunto de
menores-igualas entonces se elimina el t6rmino del
consocuente porque se cumple.
ai I aj => ai=aj
a) Si es l a desigualdad C<> y si los dos subt9rminos
-tán on un conjunto Celomentoí del conjunto -nor o el
conjunto menor o Igua l entonces se elimina el tet-mino
dol consecuenteporque se cumple.
ai I aj => ai < aj
a i < aj => ai < aj
O Si es l a desigualdad C S opora de l a misma forma pero
soiamente con el conjunto de menores iguales porque se
cumple. ai ,< aj => ai I aj
D> Si es un erpocial wste se divide en varias partes:
<@símbolo>> <Wariable» : <& I>> Cap>> <@xp ten» <bp>>.
(6 S> : <áZxpr controlada>>
Símbolo es el símbolo que identifica al especial.
Variable es l a variable de control.
L I : es el límite inferior.
L S : es el limite superior
<bp>> os un operador C < , 5 , =3.
caexpr central» : es l a expresibn que esta en medio de l o s
limites y l leva l a variable controlada.
CQSXPP. controlada»: es l a expresibn controlada.
Con esta división y utilizando el O. A. G. auxiliar se
pude revisar que cada parte sea igual s i n importar l a
variable que controla.
Si el especial no es implicado on forma total este se
pude reducir a una condición en algunos casos.
ESTRlKTuRR DE DATOS
Las estructuras fundamentales son :
Icu D.A .G que se desarrolla en una tabla con lor siguientes
campos:
- Información.
- Hijo-izquierdo.
- Hi jo-derecho.
- Tipo: C~riable,nQniero,Boleano,interno~.
- Contador: Contador do nodas quo l o apuntan.
- Estado: C P ~ i t i v o , n e g ~ t i v o - m t e ~ t i c o , n e g a t i ~ 1égico3
37
- Especial : Apuntador a l a ta& la aux i l i a r dol D, A. G. do
espuci al es.
B3 D.A.G. espec ia l , está construido de l a misma forma.
O Vectordo cadena de carreteros donde se guarda cada
variable.
D Matriz-Especial: es una matriz que en cada rengl6n esta
l a informaci6n Capuntadores d s cada D.A.G.3 de cada
especi a1 i dad.
- Apuntador de vector de cadenas donde so encuentra l a
variable controlada.
- Apuntador a l a ra íz del D. A . G . CD. A . G especia l ) do la expresi dndol 11 mi te i n f e r i o r .
- Apuntador a l a r a í z del D. A. G. CD. A . G especial3 de l a
expresión del límite superior3.
- Apuntador a l a r a i z dol D.A.G. C D . A . G especial3 de l a
expr esi ón contr o1 ada.
- Operador de re lac ión del límite inf'erior.
- Oporador de re lac ión del limito superior.
- Apuntador a l a r a í z del D. A . C . CD. A . G especia13 de l a
expresión controlada.
- Apuntador al vvctor de Str ing donde está el
cuanti f icador o l a sumtor i a espocia l .
E3 Conjuntos: Cno ordenador3 donde se guarda los conjuntos
e1 consocuento, antecedente, ospedalos.
Tambíh se usan para l a parte asociativa del Rid.
Fr) Voctw de conjuntos: donde cada conjunto es un conjunto
dm mquivaiencia de igualdad.
a Matriz: dondr todo ronglón es un conjunto Cordmaado3 de
oquivalmncia Chay dos nvtricms uno para los conjuntos de
rqU ivr l rnc ia menoros y o t r a para los conjuntos de
q u i v a l r n c l a mwnoros-iguaios3.
StsI1EMA COMO UNIDAD INTEGRADA
En esta parte damos el comportamionto del sistema:
El sistema parte de un menu principal donde están las
opci ones : -Archivo.
-Editar.
-Veri f i car. -Sa l i r .
- ARCHIVO:
Con esta opcic5n el usuario da el nombre del
archivo donde se encuentra el programa con el 4ue va a
trabajar.
Para introducir el nombre el usuario puede u t i l i z a r
algunas teclas de edicibn.
- BACK SPACE.
- -B , e .
- JXL.
- RRURN.
- EDITOR: Gon esta opción el usuario accesaun ed i to rde panta l la
integrado al programa.
Este editor fuo disofíado para proporcionar al usuario
una form de modificar el programa con las opciones de
d i c i 6 n del EDiTOR DE PASCAL.
- VERIFICA:
Por medio de esta opción el usuario v e r i f i c a el archivo
quo ya esta seleccionado, en caso de no haberse seleccionado
con anterior idad automáticamente se da l a opción de archivo
y luego se ve r i f i c a .
El ver i f icador primero lee e.1 archivo si este no esta da
un mensaje de error al usuario.
Una vez qua el archivo es leído se l e hace un a n á l i s i s
s intáct ico y si hay un error se marca editando
posteriormente el archivo para su modificación.
Si no hay error despl iega el programa y pide al usuario
l a prrcondicibn y l a postcondición.
El usuario cuenta nuevamente con l a s opciones para l a
di ci 6n.
Con la postcondición ~1 programa encuentra l a
precondici6n y se l a desplega a l usuario permitiéndole
abordar en ese momento <e>.
Si l a proposici6n es un c i c l o el programa SO encuentra
con una condicitrn do v e r i f i c a d & que primero trata de
domostrarla, si no es pos ib l e se l e da una exprosi6si
reducida al usuario para que esta l a demuestre.
El proceso s igue do i gua l forma hasta que va a salir
del c i c l o donde se encuentra otra condición de ver i f i cac ión ,
y el program se comporta de l a misma manera que con l a
anter i or condi c i ón.
l
La r'rltima condición de ver i f icac ión ocurre cuando l a
ver i f i cac ión está terminada pues l a precondición encontrada
por el programa debe implicar l o precondición dada por el
usuar i o.
En esta parte el usuario puede abordar la ver i f icac i6n
oprimiendo IESCJ y el programa da l a opción de editor para
que 01 programa fuente sea editado.
Si l a ver i f icac ión concluye satisfactoriamente el
sistema regresa u1 menú yrínci pal.
SALLkS
Esta opción es la sa l i da del sistema para ragretar a
<dos>>.
09.1207
W A L DEL USUARIO
En J a ultima sección, donde se presenta a l sistema como
unidad integrada, sedescribe el funcionamiento del programa
en general , por lo que en esta sección solamente vamos a
de f in i r a l usuario cual es el lenguaje del algoritmo
permitido para v e r i f i c a r , y cual es l a s intax i s de las
condiciones de veri f icación.
DEFiNZCION LENGUAJE PERMiITDO & ALGORITMO:
ENCABEZADO DEL PROGRAHA:
E l programa debe empezar con l a palabra PROGRAMA seguida
do un nombr SC i denti f i cador > ;
Ff NAL DEL PROGRAMA.
El programa se f i n a l i z a con I r palabra FIN.
EiEMENi'Os BASíCUS DEL LEEJIGL'AJE:
tot elementos basicos del lenguje estan integrados por:
a. sZMBOLo6 BASICO: Los simbolos basicos ostan formados por: 1. Lotras: A a l a 2, a a l a z , - ,
2. Mgitos: O I 2 3 4 S B 7 8 Q
3. Simboios Especiales: + - w / = C 3 f 3 ; :
4. 13elimitadores: Blancos y f i n d e l inea .
b. PALABRAS R-VADAS: Las palabras reservadas son parte
integral del l e gua j e del algoritmo y de l a s intax i s de 1- condiciones de ver i f icación. Estas no pueden ser usadas como i denti f icadores.
42
EMPIEZA, FIN, PWAMA, MIENTRAS, HAGA, S I , ENTONCES, Y ,
O, NO, MNS, FINM.
DEFINZCZON DE LOS ELEnENTos USADOS POR El. LEEfCuRJE:
El lenguaje permite usar los siguientes elementos:
a. IDENRFICADORES: Son usados para denotar las constantes
y las variables, estas se construyen con una letra
seguida de UM combinación de letras y numeros, un
ident i f icador es delimitado con la longuitud de l a l i n e a
80 caFacteres.
b. NUMEROS: Los numeros son constantes enteras que tienen un
rango de -32768 a 32768.
EX?RESIONES Las expresiones son copstruciones ari tmeticas que
especi f ican reglas para el ca lcu lo de valores; Estas
ó un valor numorico Centero3.
q r e s i o n s s pueden ser de un valor logic0 CFALSO, VERDAD>
OPERADORES: Los Operadores se dividon en las s iguientes
catcgor i as do pri ori dad.
1. monos Unaria.
2. NOs..oü~r;o.
3. Operador- dm d t i p l i c a c i b n : *,/,Y. 4. Operadores d o adición: +,-,O.
3. Operadoros de re lac i6n: =,<,<=,>,>=,O.
Para aumontrr l a pr ia r idad de las operadoros so permite
a i usuario utiliza C>.
PüPOSICiONES: La parbe de l a proposiciones define l a acción que va a
ser ejecutada por el programa,como estees un secuencia de
proposiciones entonces cada una de estas especifica una
parte de l a acción.
a. ASIGNACioEl SIMPLE: Es una proposición simple, esta
proposición es l a más fundamental e importante de todas
ips proposiciones y su sintaxis es:
una Variable simple, Siguida de : = , una
expresión y se termina con ;
Ejemlpo:
JAEM : = WE * 2;
En este ejemplo JAEM es l a variable simple y WE 3) 2 es
l a expresión.
b. PROPOST CI ONES ESiRUC'NRADAS:
Ai programa que se va a verificar se l e permite usar l as
siguientes estructructuras do control :
1. SeLección Condicional: esta proposición especifica l a
proposición que va aser ejecutada solo s i l a
condicibn boleana es VrmDADmmA, si esta es FALSA,
entonces otra proposición que l e sigue a l a palabra
resevada OTRO es ejecutada. La sintaxis BIS l a
sigui ente:
t
S i condicion ENTONCES proposicion i;
proposicion 2;
.. .. .. proposi c i on n;
OTRO
proposicion i;
proposicion 2;
. . . . . . proposicion m;
FINS Cuando 1 a condi ci ón bol oana es
FALSA. l a proposici6nCes3 a ejecutar es opcional y l a
s intax i s es la siguiente:
Si condicion ENTONCES proposicion i;
proposicion 2;
proposicion m;
FINS
.. .. ..
SI: i.nter<O ENiowcEs a: 4 ;
<nao b:-; FIns
2. i t e zxzc ih Condicionarl: Esta p ropw i c i bn e rpec i f i ca quw
van a so ejecutadas repetidamonte, proposiciones si
la condicic5n boleana ms VU~DADES~A; en caso contrar io
no .se e jecuta I r praposicionCms3, condici6n; La s i n t r a s es l a s iguiente:
MXENTRAS ccondicion HAGA proposicion r;
proposicion 2;
. . .. . . proposicion n;
FINM
Ejemplo:
MIENTRAS b(O HAGA a: =a+l ;
FINN.
Esta son las estructuras permitidas para l a ver i f i cac ion
de un algoritmo
CoNDrcIONEs VER IFICACION
La s intax i s do l a s condiciones do verif icacibn es ia
nrisni;i 4ue la du l as expresiones del algoritmo y d i f i e r en
en que ahora.en estas expresiones se pormiton cunti f icrdores
y rurmtoriar que tienen l a siguietltaa s intax i s .
1. TOlXKvarirblo : oxprosion i oporador exprosion 2 operador
2 .EXI~Cvrr irb le : expremian i operador exptesitm 2 operador : eícpsesion d
: -exproreion I) 2
Las expresiona i . 2 , a solamentepueden saw expresiones aritamticas; La mcprmsion 2 debo i nc lu i r a l a variabie
contr o1 ;ida
3. va r i b l e I : = SUMACvariable 2 : expresion operador
expresion t operador expresion :
expreri on3
Las exprosioraes permitidas aqui solamente pueden ser
expresiones aritmeticas, y l a expresion I debe i n c l u i r a l a
var i ab1 e contr 01 ado.
El caso de la sumaturia es la unica asignacion permitida
en las expresiones de l a condicidn de ver i f icac ibn.
I
I
1. Con este proyecto se deaiusistra que es pos ib le crear un
sistema de SOFWARE que sea una herramienta poderosa en
la ver i f icac ión de programas.
2. Dada las l imitaciones de tiempo y l a compleji'dad del proyech se r s s t r i n g i o este en l a sintaxis del algoritmo. sin embargo no so l imit6 ii quo el proyecto
fuma continuado hasta ser un sistema -nos res t r ing ido
para el usuario.
3. Como experiencia este proyecto f u é muy importante, porque
en el SI) aplicaron muchos conceptos y herramientas
nuwas.
I
BIBLi OGRAFI A
1. Ah0 A. V. Uilman 3. D., Pr i nci pl es Of Compi 1 er Desi ng . Addison Wesl ey, 1979.
2. Grieo David,
T h m Science of Programming,
Spr i nger veri ay, 1 985.
3. Backhouse C. Ronald,
Pr ogr a m Cons t r uct i on And Ver i f i cat i on,
R e t i n c e H a l l , 1988.
PROGRAMA f-RINCIPfiL
FrGyecto d e investigation
Verificacicm parc ia l d e algoritmos
Jorge Alberto Echeverry matr i cu l a #E3422771 4
OGRAM Veri f i cador-Formal -1nt er act i vo;
NST SPACE = #32; BEEP = #7; REGRESA = 13; ESC = 27; L A = 75 ; RA = 7 7 ; UA = 72; DA = 80 j
.: constantes del codigo ACC í I d e .La f lechas > C Colores 3
LOR-1 = O; COLOR-L = 14; COLOR-3 = 9; CDLCIR-4 = i5; CDLOK-5 = 4; t ipo de Datos 3 W M = 1; T-fiLF = 2; T-ALNUM = 3; GRANDE = 100; V-BAJQ = 1; PE
cad-corta = stringL53; tipo-con junto = SET OF 1 , . U-GRANDE; cad-expres = STRINGC2553; ,C Longitud de una expresi 6n .I
.tipo-nom = STRINGC203; *; Cadena donde se guarda al ntsmbre del proq: dos-rec = RECORD .: Regitro de interrupcim i J
ax, b x , c x , d x , bp, si, d i , d s , es, f l a g s : INTEGER; END;
? C Var iab les u t i l i z adas por e l editcar y el programa en forma global 2 n-chars : REAL; d r i ve : CTRINGC23; : cadena donde 5e guarda l a
identi f icacion del d r ive a c t . > di rect : STRINGC643; .: cadena donde se guarda l a
nombre : tipo-nom; caracter ,opcim : CHARS dos-cal 1 : dos-rec; r en-er r x -er r y-err : INTEGER; f i n-ed , arch-mem, 1 ee, f i nal , err: BOOLEAN; { indica e1 f i n a l de l a edicion
identi f icacion del d i rector io act .>
-ocedimientos de l editor que son u t i l i z adas par el programa ver i f icador
xedimiento que lee e l nombre del programa fuente
-0cedimiento lee un caracter s i n desplegar en pantal la
ICEDURE GetChar (VAR cc : CHAR); BEG IN Read (kbd, cc 1 ; cc := UpCase ( c c ) ; END CGetChar3;
'rocedimiento que r e a l i z a 4 t ipos d e marco entran
CEDURE marco(xi,yi,xf,yf,tipD:INTEGER); )o parametors l a s esquienas 3
041207
PROGRAMA PRINCIPAL
4R i : INTEGER; BEG IN I F (xi<xf )AND(yi.::yf >AND(tipo I N C1,2,3,41) THEN BEGIN Window (1,1,80,25) ; IF tipo IN f1,23 THEN BEGIN
END ELSE BEGIN
END; For i:=1 TO xf-xi DO BEGIN
TextBñckground (COLOR-1 1 ;TextColor (COLOR-4) ;
TextBachground (COLOR-4) ;TextColor (COLOR-1) ;
GotoXY(xi+i,yi); IF tipo IN fl,33 THEN Write(Chr(205)) ELSE WritetChar(í96)); GotoXY (xi+i ,yf 1 ; IF tipo IN Cl,33 THEN Write(Chr(205)) ELSE Wri te (Char (196) 1 ;
END; For i:=1 TO yf-yi DO BEGIN
GotoXY (xi, yi +i 1 j IF tipo IN il,93 THEN W~ite(Chr(lB61) ELSE Write(Char(l79)); GotoXY(x+,yi+i); IF tipo IN C1,33 THEN Write(ChrliB6)) ELSE Wr i te (Char ( 179) 1 ;
END; GotoXY(xi,yi); IF tipo IN f1,33 THEN Write(Chr(201)) ELSE Write(Char (218) ) ; GotoXY (xf ,yi j' IF tipo IN Cí,33 THEN Write(Chr(l871) ELSE Write (Char (191 1 ) ; GotoXY (xf ,yf 1; IF tipo IN fi,33 THEN Write(ChrIl88)) ELSE Write (Char (217) 1 ; GotoXY (xi ¶yf) ; I F tipo IN C1 , c i J THEN WriteiChr(20O)) ELSE Write(Char (192) 1;
END; TextBackground (COLOR-1) ;Textcolor (COLOR-4) ; END;
DCEDURE Pi deNombre; R i : INTEGER; dummy : STRINGL203;
BEG I N nombre := " ; Window(10,23,70,25) ;ClrScr; marco ( 10,23,70,25,2) 8 GotoXY (20,241 ; Write ('Nombre del archivo E ' ) ; i s=WhereXs GotoXY (i+20,24) ;Write(' 3 ' ) ; GotoXY (i ,241 ; dummyt =lee-val (20, T-ALF) ; FOR i := 1 TO Length (dummy) DO
IF dummyCi3 < > SPACE THEN nombre := nombre + UpCase (dummyCi3);
END {Pi deNombre3 ;
I
PROGRAMA PRINCIPAL
E R L A Y PROCEDURE Menu; iH i :INTEGER; FUNCTION selecciona: INTEGER; VAR linea : INTEGER;
PROCEDURE cñmbiafposicion, tipo: INTEGER) ; BEG IN IF tipo=l THEN BEGIN
END ELSE BEGIN
END; CASE linea OF
Tex tColor (COLOR-4) ; textBackground (COLOR-3) ;
TextColor (COLOR-3) ; textBackground (COLOR-4) ;
1 ; BEGIN Window ( 5 , 5 , 3 5 , 7 ) ; C1rCcr;GotoXY ( 2 , 2 ) ; Write(’ Archiva ’,nombre); END;
2: BEGIN Window(45,5,75,7) ;ClrScr;GotoXY ( 2 , 2 > ; Write(’ Verificar el Programa’) j END;
’3: BEG IN Window(5, 10,35, 12) ;ClrCcr;GotoXY ( 2 , 2 ) ; Write(’ Editar el Fragrama’); END;
4: BEGIN Window(45,16,75,12) ;ClrScr;GotoXY (2,2); Write(* Salir del sistema’); END;
ELSE; END; TextColor (COLOR-2) ; textBñckground (COLOR-1) ; END;
PROCEDURE up-down-arrow; BEGIN Read (Kbd,caracter) ; cambi a ( 1 i nea, O) ; C4SE O r d (caracter 1 OF
UA: BEGIN IF linea-230 THEN linea:=linea-2 ELSE 1 i nea: =1 i nea+2; END;
IF 1 inea+2<=4 THEN 1 i nea: =1 i nea+2 ELSE 1 inea: =1 i nea-2; END!
IF linea-l>0 THEN linea:=linea-1 ELSE linea:=linea+l; END;
IF íinea+l<=4 THEN linea:=linea+l ELSE 1 i nea: =1 i nea-1 ; END;
DCIi BEGIN
LA: BEGIN
RCS: BEGIN
ELSE Write (BEEP) ; END;
cambi a (1 i nea, 1 ) ; END;
I
I
BEGIN {Procedimiento selecciona 3 1 inea:=l ; cambi a ( 1 i nea , 1 1 ; REPEAT
Read(Kbd,caracter) 5 IF Ord(caracter)=ECC THEN BEGIN
IF keypressed THEN up-dawn-ai-r n w ELSE Write(EEEF1 j
END ELSE I F Ord(caracter)rSREG~ESG THEN Write(EEi?!;
UNTIL (Ord (carñcter) =REGRESA) ; selecciona:=linea; END; ;de seleciana)
3- oced i rn i en t ri menu p r i nc i pal BEGIN TextEack;ground (COLOR-1) j Window (1,1,80,25); ClrScr ; marco (2,2,78,23,1) ; TextCol or (COLOR-T> ; to::t3ackgrctund (CDLGFi-4) 5 Window(5,5,Z5,7> ;ClrScr;GotoXY (2,4); Write ( ’ Archivo ‘ ,nombre) 5 Window(5, iO,35,12) ;ClrScr;GotoXY(L,S); Write(’ Editar el Wogrñma’ 1; Window (45,5,75,7) ;ClrScr ;GotoXY (2,2) ; Write(” Ve r i f i c a r el .Frograma”); Windorr(45,10,75,12! ;CliScr;GotoXY(2,2); Write(’ S a l i r del sistema‘); marco (18,17,62,21 ir 4 ) ; TextColor (COLOR-4) ; textBackgraund (COLOR-3) ; Window ~19,18,61,20) ; ClrScr; GotoXY(S,2); Write(’U5e lac; N FLECHAS ‘S para moverse’)j GotoXY(5,3);Write(’Seleccione l a opcibn con ..X RETURN 3 ‘ ) ;
CASE 5elecciona OF 1 : opcicm:=’A7; 2: opcion:=7V”; 3: opcion:=’E’; 4: opcion:=’S’;
END; END CMenu3;
C edproyec.pas> t )
-0cedimiento Principal del programa ver i f icador 3.
IRLAY PROCEDURE Veri f -Formal ;
JST C Constantes d e l nodo 3 VALOR = 1 ; rzQ = 2; DER = 3; TIPO = 4; CONT = 5; ESTADO = 6; .: Constantes d e l t i p o de nodo 3 INTERNO = 1 ; NUMERO = 2; EOLECINA = 3; IDENTI = 4; VACIO = 5; C Constantes d e valores 3 FALSO = 0 ; VGRDAD = 1; C Constantes d e operadores Aritmeticcs 3 SUMA = 43; RESTA = 45; MULT = 42; DIVI = 47; C Constantes d e operadores d e re lac idn 3 C-MAYOR = 62; C-MENOR = 60; C-IGUAL = 61; MAY-IG = 242; MEN-IG = 247% C-DIFER = 216; NO = 126;
- 3
PROGRAMA PR I NC I PhL
C Constantes d e crperadores Lcgiccíis :.
Y = 38; U = 124; < Identi f icadore especia les 3 CORCH-IZí2 = 91 ; CDRCH-DER = 93; F A - : ZC! = 4Q; PA-;iEfi =. 4 1 j PUNT-COM = 59; DOS-PUNT = 5B; .-IN = O;
Constantes d e ? a t a b l a como est ructws . d e r j a t cz :. LON-L = 6; Lord-rw = 150; MGX-ET~~ = 7 ~ 5
.: Constantes de l u s crjnjitntass -I -3
Constantes para l a dirección del SO D.A.G. 3.
: - OP-I = 6 ; E-OP-D = 7 ; E-EXPR = 8; E - AP-STR = 95
.: Constantes d e signo en rada i i G 9 ?IRITEMETICD, 3 BOOLEANO Z. POS1 = o; NEG-ARIT -= 1 ; NEG-BOL = 2 ;
MAX-CGNJ = 3 ; MAX-ELE-EBU = 10; MAX-CON-EBU = 10;
- T I P O = 1 ; E-CONTR = 2; E-EXP-I = 3 ; E-EXP-D = 4; E-EXP-II = 5 ;
1
.: Apuntador al padre si asta dentro d e otra proposicion; apuntadores a Icc proposicion s iguiente y a l a ante r iw3
padre, hno, ant : apcrnt-2;
< Si e s t a dentro de una seleccion indica si 5s zurnple
si -no : INTEGER; l a condicion 3
.:Tipo de prcposi c i ones Asignaci an, Seleccion, ¿ici o 1 Case tipo-prop :c lase OF
CVarible, expresion a l a que se i gua l a ' Q ? : ( expre,varia :cadena) ;
3
CCodicion de l a seleccion, apuntadores a ia ultima
'C': ( cond-s :cadena; proposicion de l a 5 2 partes 3
tipo-hi j o : INTEGER; hi jo-5-si , h i jo-s-no: apunt-2) ;
CCondicion del c i c l a , apuntador a la ultima
'C': cond-c z cadena; proposician del c l c l o 3
hi jo-c : apunt-2)
conjunto = SET OF 38. .255; tupla = ARRAYCi..LON-Ll OF INTEGER; ,:Henglctn de l a t a b l a "NODO"> matriz = ARRAYCi..LON-MATI OF tupla; {Definicidn d e l a t a b l a P
{Tabla aux i l i a r para almacenar d e los str ing) vect-str = ARRAYCl..MAX-STRl OF cadena; t-tab-esp= ARRAYCI..i0,1..93 OF INTEGER;
END; € Del r e g i s t r o tabla )
PROGRAMA I”R1 TdC I PfiL
VST .; Loniltan.y.es d e los tcjeintas permitidas 3 OP-REL: conjuntcl =CC-MENOR. I L-PIAYOR, iIAY-IG, PlEN-.’!:C, C-DIFEF13 j OP-CUM: canjunto =CSUMA,RESTAl; 0P-HüLT:conjunta =tMULT,DIVI3; OF-AR I T : c o n j u n t o =CSUMA, RESTA, MüLT II 3 IVI 3 ; CONMUTfi: cmjunto =fSUMA, MULT ,Y ,O ,C_XGUAL ,C_D lFE~~~
3 matr-men,mat-m-ig :tipo-matr-cunj; con j-oqui :matr-con:;
ultimo,ap_prirn,uit_tab_str, i ibr-e, ap-tabla, ap-dag1 ap-dag2, x , yy , i , r7 i vei resul t : INTEGER; pal ab-auxi , control a :cadena; tab-str ; vect-str: tab i a , Oag-sspe :matriz;
tope u1 t-dag-aspe : INTEGER;
abort a , est a : POOLE&?\l;
tabla-sspe rt-tab-esp;
apuntador : apunt-2; pal abra, b u f f or : cadena; h L i f f -í?:.:pr- 5 bLl+í_3 rengi on I ap-Cer ap-i z q 1 ong i tud toquen,tipo_-in,ult_ren_Exp: INTEiiEFr; arc h-e:< Fr : vec_e.:pu-; car : CHAR;
: r a d kxpres; -
s i n t ac t i co pas: -eductcr. pas9 jemuesjtra 2 ieri f icadar . pas)
BEGIN C Procedimiento pr inc ipa l de la v e r i f i c a c i m arch-mem: =False; IF nombre=” THEN PideNombre; .:Hace 91 ana i i s i s rjintactico apuntada- : =aria1 i si 5-si n t act i co i Truei ; IF apuntador(>Nil THEN ver i f icador (apuntador) ELSE ScreenEdi tor ( ‘ E ‘ 1 ; END;
i IN {Program pr inc ipa l 3. iombre: =’ ‘ * 9
-en-err: =O; :-err:=O; /-err: =O; l i rect :=” j :in-ed: =FALSE; tEPEAT
Men u ; Window(l, 1,80,25) ;C l rScr ; CASE rrrpcion OF
.COpci ones del ed i tor E’ 9 ’ A ’ :BEGIN
TextBackground ( 0 ) j TextColar (151 ; ScrsenEditor (opcion) ; END;
3
091287
PROGHAMFI FRINCIFAL
CDpcion de v e r i f i c a r un programa ' V ' : Verif-formal; 'SI : fin-ed := TRUE
END; Window (1, 1,6Q, 25) ; G l r S c r ;
UNTIL f in-ed; ID.
I
Programa de validacion de caracteres entrada
JNCTION lee-mayuscul a:CHAR; 1R carñcter :CHAR; BEGIN Read(Kbd,caracter) ; caracter: =Upcase(caracter) ; 1 ee-mayuscui a: =car act er ; END;
?OCEDURE restaura(pos,longitud: 1NTEGER;cad-leer cad-expres) ; ír x: INTEGER; BEGIN x:=WhereX; GotoXY (x-pos,WhereY) ; C1 rEol ; Write (cad-1 ee) ; GotoXY (x-p~s+l ongi tud, WhereY) ;Write ( ’ 3 ’ 1 ; GotoXY (x-1,WhereY); END;
(OCEDURE escribe(Var pos: 1NTEGER;car:CHAR;VAR cad-lee:cad-expres) j BEGIN Write(car1; Delete (cad-1 ee, pos, 1 ) ; Insert (car,cad-lee,pos) j
END ; pos: =po5+1;
OCEDURE val-esp (Var pos: INTEGER; longi tud: INTEGER; car:CHAH;
NST LA = 75; Rh = 77; DEL = 83; VAR cad-lee:cñd-expres) ;
BEG IN CASE Ord(car) OF
L A S IF pos>l THEN BEBIN Write (#SI ; pos: =pos-í ;
END ELSE Write(BEEP1; RA: IF (pos<lmgitud)AND(pos<=Length (cad-lee) )THEN BEGIN
GotoXY (WhereX+l,WhereY) ; pOciS=pO%+l;
END ELSE WritetBEEP); DEL: IF pos>l THEN BEGIN
Dt?lete(cad-lee,poe, 1 ) 3
restaura(pos,longitud,cad_lee) ; pos: =pos-í;
END ELSE WritetBEEP); ELSE Write(BEEP1;
END; END;
UCTION val-caracter ( V a r pos: INTEGER;longitud,tipor INTEGER; carrCHARg VAR cad-leeicad-expres) :BOOLEAN3
\IST BS = 8 3 RET = 131 BACKS = #83 TIP-NUM = 13 TIP-ALF = 2; T-ALNUM = 3; BEGIN val -car act er : =Fa1 se$ CASE Ord(car) OF
ES : IF pos>l THEN BEGIN posr=pos-1; Delete (cad-1 ee, pos, 1 ) ; IF pos>Length (cad-lee) THEN Wri te(EACKS,Chr (32) ,BACKS)
Programa de validacion de caracteres entrada
ELSE restaur a (pos y 1 ong i t ud cad -1 ee ; END ELSE Write(BEEP) j
RET : val-caracter:=True; ELSE COSE t i p o OF
TIP-NUN : IF Ord(car) IN C48..573 THEN escribe(pos,car,cad-lee)
ELSE Write(BEEP); TIP-ALF : I F Ord(car1 IN E32,46,65. .90,95,97.. 1221 THEN
T-ALNUM : IF Ordtcar) IN
escribe(pos,car,cad-lee) ELSE Write(BEEP1;
C32.. 126,228,231,238,242,2433 THEN
ELSE Write(EEEP1; escribe (pos,car, cad-lee)
END; END; I F pog>lohgitud THEN val-caracter:=True; END;
JCTION lee-val (longitud, tipo: INTEGER) :cad-expres; 3 dato :STRINGC23; PO5 : INTEGER; termina :BOOLEAN; c ad-1 ee : STR S NGC 2553 5
BEG IN
termina:=False; Deletefcad-lee, 1,Length (cad-lee) );
REPEAT
pos: =l;
Read (Kbd, dato[ 13 1 ; , I F Ord(datoClJ)=ESC THEN
I F Keypressed THEN BEGIN Read(Kbd,datoCZJ); val-esp (pos,longitud,datoC2l,cad~iee);
END ELSE BEGIN
Delete(cad-lee, l,Length(cad-lee) 1; pos:=l; termina: =True;
END ELSE ter m i nao =val -cat- acter (pos, 1 ongi tud , t i PO, datoi 1 3 , cad-1 ee) ;
IF tipo=T-NUN THEN cad-leeCllr=Chr (47) ELSE cad-1 ert 1 3 t =Char (32 ) ;
lee-val : =Copy (cad-1 ee, 1 , Length (cad-1 eel 1 8
UNTSL termina; IF Length (cad-lee) <O THEN
END;
I
I
I
I
P r o g r a m a que hace anal i s i s s i n t a c t i c o
'uncion que compara 2 cadenas y regresa va lores de ( F , V ) 3 JNCTION comparatcadl,cad2:cadena) :BOOLEAN; i e x i to: BOOLEAN;
k: INTEGER; BEG I N k:=1; e x i to: =Fa1 se; C Compara l a s ioq i tudes I F Length (cadl)=Length (cad21 THEN BEGIN
e x i to: =True4 € Compara cada c a r a e t e r de l a s cadenas WHILE ( k<=Length (cad 1 1 1 AND (ex i t o ) DO
I F Upcase (cad 1 C k 3 ) =Upcase (cad21 k 3 1 THEN k: =k+ l ELSE e x i to: =Fa1 se;
END; compara :=ex i to; END;
nal is ier C i n t a c t i c o de l a l g o r i t m o 3 lNCT ION anal i s i s-si n t a c t i cÓ ( t o t a l : BOOLEAN) : apunt-2; IST
3 b f i n i c i o n de l a 5 constantes para c l a s i f i c a r un TOKEN MCSX I MO = 12; L I M I T E = 30; ERRO = o; D I G I T 0 = 1 ; LETRA = 2 ; AD I C I O N = 3; MULTIPLICADOR = 4; PA- IZP = 5; PA-DER = 6; MENOR = 7; IGUAL = 8 ; MCIYOR = 9 ; MEN- IGUAL = 10; MAY - I GUAL = 11;
F I N = 16; COMENTARIO = 17;
NUMERO = 20; DIFERENTE = 21;
PUNTO = 12; BLANCO = 13; PUNTO-COMCS = 14; RESERVADA = 15;
OP-RELACIONAL = 17; IPENTIFICADOR = 19;
CORCH-IZQ = 22; CORCH-DER = 23; NEGA = 245 DOC-PUNT = 25;
ar reg lo = ARRAYLl..MAXIMOI OF cadena; arch = ARRAY C l . . L I M I T E l OF cadena;
'E
IST ie f in ic ion de l a 5 palabras RESERVCIDAS en e l lenguaje del a l g o r i t m o 3
RESERVA: a r reg lo =('EMPIEZCS','FIN','PROGRAMA','M~ENTRAS?,'H~GA','S~?, 'ENTONCES', ' Y ' , " O ' , 'NO?, 'FINS', 'F INM' ) ;
va l or express ab ie r to t e x t o ap-actual , ap-hno carac ter
: INTEGER ; :cadena; :BOOLEAN; :TEXT; : apunt-2; : CHCIR;
rocedimiento que despliega e l t i p o de error s in tac t i co y genera e l corte e l ana l i s i s s i n t a c t i c o 3
PROCEDURE e r ro r (numero: integer) ; VCIR I : INTEGER; , BEGIN
T e x t B a c k g r o u n d (COLOR-5) 3 T e x t C o l o r (COLOR-4+15) ; err : =True; CASE n u m e r o OF
Programa que hace a n a l i s i s s i n t a c t i c o
O:Writeln(’*SS ERROR SS*S Espera PROGRAMA’); l :Wri te ln( ’ tSS ERROR t S t S Espera nombre del programa’); 2:Writeln(‘ tY* ERROR SSltS Espera FIN’);
4:Writeln(’StS ERROR t t S t Espera HAGA’); S :Wr i te ln ( ’ t t t ERROR %Y** Espera ENTONCES? 1; ó:Wri te ln( ’ t*S ERROR S t * S Espera Iden t i f i cador ’ ) ; 7 :Wr i te ln( ’ t tY ERROR t S t S Espera ‘I 1 l a ’ ) ;
S:Writeln(’YtS ERROR Y S Y S Toquen no de f i n ido ’ ) ; lO :Wr i te ln ( ’ t t t ERROR S t t t Espera I’ ; I t ’ ) ;
I l : W r i t e l n ( ’ t S t ERROR # % S t No encuentra e l programa’); 12 :Wr i te ln ( ’ t t t ERROR S t t t Espera EMPIEZA”); 13:Writeln(’XYX ERROR t t t t Espera Proposicion’); 14:Wr i te ln( ’St t ERROR t t t t I’ F i n ‘I I nd i ca f i n de archivo ’ ) ; lS:Wr i te ln( ”S* t ERROR l f f X Espera I’ 3 “’1; 1 6 : W r i t e l n ( ” t t t ERROR Y**% Espera “FINM”’); 17:Wr i te ln( ” tSt ERROR XSSS Espera “FINS“’); ELSE
3:Wr i te ln( ’ t tY ERROR t t t t Espera Igual I’ = ’1;
END; i termina caso> {Var iab les globale5 donde se guarda la p o s i c i m del e r ro r ren-err : =renglon; y-err : =ap-i zq; TextBaekground (COLOR-1 1 : Textcolor (COLOR-2) ; END;
i
’rocedimiento que abre e l arch ivo t e x t o > 3VERLAY PROCEDURE 1 ee-programa; JAR termina : BOOLEAN;
resu l tad0 : INTEGER; BEG I N ab i er t o: =Fa1 se; termina: =Fa1 se; REPEAT
ClrScr; W r i t e l n (nombre) ; fissi gn (texto, nombre) ; €11-3 Reset ( t ex to ) ; €SI+) resul tador= IOresul t ; I F resu l tador0 THEN BEGIN
terminar=True; abiertorrTrue; e r r I =Fa1 se; ClrScr;GotoXY(l, 1 ) 5 Wr i te ln ( ’ L is tado del programa ’1;
END ELSE BEGIN C Lee o t r a vez e l nombre del arch ivo t e x t o >
e r r o r ( 1 l ) j W r i t e l n ( ’ CSborata 1 a v e r i f i cac i bn S/N’ 1 8 Repeat Rcad(Kbd,caracter) 9 UNTIL Upcase(Caracter) IN E’S’,’N’3; I F UpCase(caracter)=’N’ THEN PideNombre ELSE terminas =True3
END : UNTIL termina;
arch-memr =Fa1 se; reng l on I =O3 END;
k r i a b l e que i n d i c a que e l programa no esta en memoria >
Yuncion lee e l s igu ien te renglcin de l arch ivo t e x t o y l o guarda en BUFFER e i n d i c a el f i n 3
Programa que hace a n a l i s i s s intact ico
3CEDURE lee-renglon; BEG I N IF Not arch-mem- THEN
IF (Not Eof (texto))AND Not err THEN BEGIN renql on : = rengl on+ 1 ; Read1 n (texto, buf fer ) ; longitud:=Lenqth(buffer); Wri t e l n (renglon, ' ' $bu f f e r ) ; IF longitud=O then lee-renglon; ap-der : =O;
END ELSE BEGIN
toquen:=f in : f i n a l :=True;
END ELSE
IF renglontul t-ren-exp THEN BEGIN rengl on: =rengl on+l ; longitud:=Length (arch-exprCrenglon3) ; buffer:=Copy(arch~exprCrenglonl,l,longitud~;
END ELSE BEGIN
toquen:=fin; f i n a l : =True;
END; END:
hrocedimiento que borre 105 blancos entre el ultimo TOKEN analizado y . siguienmte >
)ROCEDURE Borra-bl anco; BEG IN WHILE (Ord ( bu f f e r Cap-der 3 1 =32) AND (ap-der<l ongi tud) DO
ap-dar: =ap-der+l; END;
incion que compara l a palabra del ultimo TOKEN con l a s palabras reservadas3 :UNCTION pal abra-reservada: BOOLEAN3 IAR encontro :BOOLEAN;
dux i 1 i ar : cadena: i : INTEGER3
BEGIN io=l; auxi 1 i ar:=Copy ( bu f f e r , ap-itq, ap-der-ap-izq+l) ; enccmtror=False( W H S L E (i<4lCSXIMO)AND(NOTfencontro) 1 DO
IF compara(reservaCi 3 ,auxi l iar ) THEN encontro:=True ELSE it=i+l3
pal abr a-r eser vada 8 =encon tr a; IF i=2 THEN toquen:=FIN; END;
'rocedimiento que i d en t i f i c a el caracter que se ana l i za IRLCIY PROCEDURE i dent i f i c a :
BEGIN toquen: =ERRO: CASE Ord (buf fer Cap-der 3 1 OF
65. .90,97. . 122ttoquen:=LETRA; 48. .57rtoquenz=DIGITO;
124,43,45:toquens=ADICION;
3
Programa que hace analisis sintactico
94¶ 38,42,47: toquen: =MULTIPLSCADOR; 40: toquen:=PA-IZO; 41: toquen:=PA-DER; bO:toquen:=MENOR; 32: toquen:=ELANCO; 61:toquen:=IGUAL; 62: toquen:=MAYOR; 46: toquen: =PUNTO; 58: toquen:=DOS-PUNT; 59:toquen:=PUNTO_COMA; 91 : toquen: =CORCH- I ZRg 93:toquen:=CORCH_üER;
ELSE 126: toquen: =NEGA;
END;€ EL CASO3 I F longitud=O THEN toquen:=BLANCO; END; €procedimiento3
'rocedimiento que determina el TOKEN, detectando un TOKEN no definido 3 3OCEDURE 1 e x i co; 3 copia :BOOLEAN; BEG I N copi a : =Tr ueg IF lee CSND NOT err THEN BEGIN
IF (ap-der>=iongitud)AND Not (final 1 THEN lee-renglon; IF Not (final) THEN BEGIN
Delete(palabra, l,Lenqth(palabra) 1; ap-der: =ap-der+l; borra-bl anca; i dent i f i ca; ap-izq:=ap-der;
END ELSE toquen:=FIN; CASE toquen OF € Si e5 una variable o una palabra reservada 3.
LETRA :BEGIN WHILE ( (toquen=DIGITO)OR(toquen=LETRA) 1
AND ( ap-der< 1 ongi tud 1 DO BEG IN ap-der:=ap-der+l; i dent i f i c a ;
END; IF (toquen<>DIGITO)AND(toquen<>LETRA)THEN ap-der:=ap-der-1; C Si es paiabra reservada por el lenguaje 3 IF palabra-reservada THEN BEGIN
IF toquen< >FIN THEN toquen3 =RESERVADA: IF (ap-izqrap-der) THEN BEGIN
I F Upcase (buf f erfap-izql) =*YJ THEN
ELSE I F Upcase (buf f er Cap-izqJ 1 =J O' THEN toquen:=MULTIPLICADOR
toquen:=ADICION; END;
END ELSE toquen:=IDENTIFICADORs END 3
DIGIT0 :BEGIN < Si e5 numero; solamente numeros enteros
WHILE (toquen=DIGITO)AND(ap-ders ap-der:=ap-der+l; identifica;
END;
3 1 ongi tuc DO BEGI.1
I I I
I
: I
I
I I
I
I
I
j I
I
I
, I
Programa que hace anaiisis sintactico
palabra:=Copy (buf f er , ap-i zq, ap-der-ap-izq+l) ; IF toquen.: >DIGIT0 THEN ap-der: =ap-der-1; toquen: =NUMERO; END;
MENOR :BEGIN C Si e5 un operador de relacion: *<,<= , 6, 0 3
ap-derz=ap-der+l; identifica; IF toquen=IGUAL THEN tipo-sin:=MEN-IGUfiL ELSE
IF toquen=MAYOR THEN
ELSE BEGIN ti Po-si n : =DI FERENTE
ap-der: =ap-der-l; ti Po-si n : =MENOR;
END; toquen:=OP-RELACIONAL; END;
IGUAL :BEGIN < Si es el operador de re lac ion = 3.
toquen:=OP-RELACIONAL; tipo-sin:=IGUAL; END:
MAYOR :BEGIN € Si e5 el operador de relacion > 6 >= 3 ap-der: lap-der+l;
identifica; IF toquen=IGUAL THEN tipo-sin:=MAY-IGUAL ELSE BEGIN
tipo-si n: =MAYOR; ap-der : =ap-der-1
END; toquen:=OP-RELACIONfiL; END;
C Si el toquen e5 * => 'NO' "Nega~i6n~~ 3 NEGA : BEGIN
pal abra: =' NO' ; toquen:=RECERVADA; copia:=False; END;
COMENTfiRI0,BLANCO € si empieza un comentario este termina hasta terminar el renglon, si el renglon es blanco 1
- :BEGIN ap-der:=longi tud; 1 QX i co; END 8
ERRO 8 error (9) ; i el TOKEN es: C, 3 , (, 1,; ,#,/,+,-,: ,FIN,
IZQ,PUNTO-COM~,PA-DER,~OS-PUN,CORCH-IZQ,CORCH-DER, TIPLICADOR,ADICION,FINICORCH_IZQICORCH~IZQ,CORCH~DER 3
END; Cdel Caso 1 IF (ap_izq<=ap-der)AND(copia) THEN
FIN indica fin del archivo"
ELSE :
palabra:=Copy(buffer,ap_itq,ap_der-ap-der-ap-izq+l) ;
1 ee: =True;
.--
Programa que hace a n a l i s i s s i n t a c t i c o
Procedimiento que r e v i s a lcc s i n t a x i s de una expresion y regresa l a
ROCEDURE ex pr eíi on ; expresion en una cadena 3
€ s i n t a x i s de l a va r iab le 3 PROCEDURE var i ab 1 e;
BEG I N expresst=Concat (express,palabra) ; lex ico; I F toquen=CORCH-IZG! THEN BEGIN
express:=Concat (express, ’ C ’ ; ex p r es i on ; lex ico; IF toquen< > CORCH-DER THEN error (15) ELSE express:=Concat (express, ’ J’ ;
END ELSE 1 ee: =Fa1 se; END;
C s i n t a x i s de l f a c t o r mantiene la misma p r i o r i d a d de operadores a: Negacion, O , 3 PROCEDURE f a c t o r ;
BEG I N 1 ex i EO; I F compara(palabra, “0’ 1 THEN BEGIN
express:=Concat (express, ’NO’ ; 1 ex i co ;
END; I F toquenrADICION THEN BEGIN
express:=Concat (express,bufferCap-derJ): 1 ex i co;
END : I F toquen=PA-IZQ THEN BEGIN
express:=Concat (express, ’ ( ’ ; expresi on ; 1 ex i co; I F toquen< X’A-DER THEN error ( 7 ) ELSE express: =Concat (express, ’ ) ’ 1 ;
END ELSE
IF toquen=IDENTíFICADOR THEN v a r i a b l e ELSE
I F toquen< ).NUMERO THEN e r r o r ( 6 ) ELSE express:=Concat (express,palabra) ;
END#
C s i n t a x i s de l termino mantiene l a misma p r i o r i d a d de operadores a: Diryuncion, *,/ 3 PROCEDURE termi no;
BEG IN factor; 1 ex i co; WHILE (toquenrMULTIPLICAD0R)AND (Not err DO BEGIN
expresstrconcat (express,bufferCap-derl) ; factor; 1 ex i co;
END: lee: =Fa1 se! END;
Programa que hace a n a l i s i s s intact ico
C s intax i s de l expresion simplemantiene l a misma prior idad de operadores a: Conjucion, +,- 3. PROCEDURE expresion-simple;
BEG IN termi no; 1 ex i eo; WHILE (toquen=ADICION) (SND (Not err 1 DO BEGIN
express:=Concat (express,bufferCap-derI) ; ter m i no; 1 e x i co;
END; 1 ee: =Fa1 se; END;
BEGIN € in i c i a procedimiento expresion3 e x pr esi on-si mp 1 e; 1 ex i co; WHILE (toquen=OP-RELACIONAL)AND(Not err 1 DO BEGIN
express:=Concat (express,palabra) ; expresion-simple; lex ico ;
END; lee : =Fa1 se; END;
brocedimiento que an l i za l a s intax i s de l a5 estructuras de control del .enguaje en que se crean l o s programas.
PROCEDURE proposicion;
C Procedimiento que t r a e del sistema un apuntador a un r eg i s t ro e i n i c i a l i z a l o s apuntadores a1 padre, hermano, anterior 1 PROCEDURE nuevo(VAR apuntador:apunt-2);
BEG 1 N New(apuntador); apuntador*.ant:=NIL; apuntador*.hnor=ap-hno; IF ap-hno<>NIL THEN ap_hno^.ant:=apuntador; apuntador*. padre: =NIL$ apuntador". si -no: =O; END 8
€ Procedimiento quo v e r i f i c a l a s intax i s de l a seleccion y actual iza el r eg i s t ro de es ta 3 PROCEDURE se1 ecc i on ; VAR ap-padre: apunt-2;
otro t BOOLEAN 8 BEG I N nuevo(ap-actua1); €da l o s valores del r e g i s t r o para i dent i f i c a r l a seleccion WITH ap-actual* DO BEGIN
tipo-propr: =S; h i jo-s-si :=Ni 1 ; h i jo-5-no: =Ni 1 ;
END; ap-hno: =Ni 1 ; ap-padre: =ap-act ual ; Delete(express, 1,Length (express) 1 ; expresion: IF Not e r r THEN BEGIN
ap-actual". cond-sr=Copy (express, 1 , Length (express) ) ;
3
Programa que hace a n a l i s i s s i n t a c t i c o
lex ico; otro:=false; I F compara(palabra, ’ENTONCES’ THEN BEGIN
ap-actual”. t i po -h i jo:=O; 1 ex i co; WHILE NOT(compara(palabra,’FINS’) )AND(NOT e r r ) UD BEGIN
1 ee: =Fa1 se; propocii c i on ; ap-actual*. padre: =ap-padre; C En e l r e g i s t r o del h i j o guarda s i esta es pr-oposicion
IF ap-padre^.tipo- h i j o = i THEN ao actual-+.si-no:=l; lexico; IF compara(palabra, ’OTRO’ THEN BEGIN C S i n¿,‘ o t r o ac tua l i za e l r e g i s t r o dando un apuntador
cuando no se cumple l a condicion 3
a l h i jo-s-s i , que es l a u l t ima proposic ion cuando se cumple l a condicion e i n d i c a que i o 5 h i j o s s iguientes son del o t ro$ 3
ap-padre”. h i jo-s-si : map-actual ; ap-hno: =Ni 1 i otro: =True; ap-padre“. t i po -h i jo:=X; 1 e x i co;
END; IF f i n a l THEN error (17) ;
END; ap-padre*.hijo-s-no:=NIL; I F o t r o THEN ap-padre”. h i jo-s-no: =ap-actual ELSE ap-padre^.hi jo-s-si :=ap-actual ; ap-hno: =apepadre; ap-actual : rap-padre;
END ELSE error ( 5 ) ;
END; END;
PROCEDURE i t e r ac i on ; VAR ap-padre : apunt-2;
BEG I N nuevo(ap-actuai) 5 ap-actual”. tipo-prop; =C; ap-actual^.hi jo-c:=Nil; ap-hnoa =Ni 1 ; ap-padre:=ap-actual ; Deletetexpress, 1 ,Length (express) 1 ; ex p res i on ; IF Not err THEN BEGIN
ap~acturl*.cond~c:=Copy(express, 1,Length (express) 1 ; 1 ex i co; I F compara(palabra,’H~GA’) THEN BEGIN
1 e x i co; WHILE NOT(compara(palabra,’FINM’) )AND(NOT err) DO BEGIN
1 ee: =Fa1 se; proposicion; ap-actual padre: rap-padre; 1 ex i co; IF f i n a l THEN error(l6):
END; ap-padre”. h i jo-c: =apeactual g ap-hnor rap-padre;
I
Programa que hace a n a l i s i s s i n t a c t i c o
ap-actual : =ñp-padre; END ELSE error (4 ) ;
END; END;
PROCEDURE as i gnac i on ; BEG I N nuevo (ap-actual 1 ; ap-actual*. tipo-prop:=&; ap-actual*. var i a: =Copy (pal abra, 1, Length (pal abra) 1 ; lex ico; I F toquen-CORCH-IiQ THEN
WITH ap-actual* DO BEGIN REPEAT
varia: =Concat (var ia, p a l abra) ; lex ico;
UNTIL (toquen = CORCH-DERIOR (toquen=OP-RELACIONAL) ; I F toquen0CORCH-DER THEN error(l5) ELSE varia:=Concat (varia,palabra);
END ELSE 1 ee: =Fa1 se; 1 ex i co; I F tipo-sin=IGUAL THEN BEGIN
Delete(express, l,Length(express) 1; expr @s i on ; ap-actual^. expre: =Copy (express, 1 , Length (express) 1 ; ap-hno: =apeactual ; 1 ex i co ; I F toquenOPUNT0-COMA THEN e r r o r ( l 0 ) ;
END ELSE e r r o r ( 3 ) ; END:
BEGIN € I n i c i a e l procedimiento proposici6n3 ap-actual :=Ni 1 ; 1 ex i co; CASE toquen OF
RESERVADA# I F compara(palabra, ’ S I ’ ) THEN seleccion
ELSE e r r o r (13) ; ELSE I F compara(palabra,’MIENTRAS’) THEN i t e r a c i o n
1DENTIFICADOR:asignacion; FIN8 f i n a l :=True;
ELSE e r r o r (13) ; END; C termina e l caso d e toquen3 END;
PROCEDURE proposiciones; BEG I N 1 ex i co; I F compara(palabra,’EMPIEZA’) THEN BEGIN
1 ex i cos ap-hno: =Ni 1 ; WHILE (toquen<>FIN) AND (NOT e r r ) DO BEGIN
lee:=False; proposi c i on ; lex ico;
END g 1 BB: =Fa1 se;
I
Programa que hace a n a l i s i s s intact ico
END ELSE error (12) ; END;
PROCEDURE borra-1 i s t a (actual : apunt-2) ; JAR hermano : apunt-2;
BEG I N WHILE actual<>Nil DO BEGIN
WITH actual" DO BEGIN hermano: =hno; CASE tipo-prop OF
A: Dispose(actua1) ; C: BEGI9l
ZF hi jo-c.<>Nil THEN borra- l ista(hi jo-c) j Dispose (actual ) ;
END; S: BEGIN
IF hi jo-s-siONil THEN b ~ r r a _ l i s t a ( h i j o _ s - s i 1; IF hi jo-s-no< >Ni 1 THEN borra-1 i s t a (hi jo-s-no) ; Dispose(actua1) j
END; END;
actual :=hermano; END;
END; END;
:UNCTION sintact-completo: apunt-2; BEGIN €Procedimiento que hace el a n a l i s i s s intact ico 2 err:=False$ ren-err:=O; y-err : =O; Final :=Fa1 se; 1 ee-programa; lee:=True; si nt ac t -camp 1 et o: =Ni 1 ; I F abierto THEN BEGIN
1 ee-rengl on; 1 ex i co; ap-actual :=Ni 1 ; IF NOT compara(palñbra, 'PROGRAMG' 1 THEN error ( 0 ) ELSE BEGIN
1 e x i co; IF toqusn<>IDENTIFlCADOR THEN e r ro r (1 ) ELSE BEGIN
proposiciones; 1 ex i co 9 IF (toquenOFIN)AND(NOT err) THEN error (2);
END; END 3 IF ((ap-der<longitud)OR(NOT Eo+ (texto)) )AND(NOT err) THEN error (14)5 Writeln; C1 ose (texto) ; abiertos =False; IF NOT err THEN BEGIN
sintact-compieto:=ap-actual; Writeln(BEEP1; Writet 'para continuar "OPRIMA" cualquier tec la ' ) ; Read (Kbd,caracter);
END
Programa que hace ana l i s i s s intact ico
ELSE BEGIN IF ap-actual< >Ni 1 THEN BEGIN
WITH ap-actual^ DO WHILE padre< >NIL DO ap-actual :=padre;
borra- l ista (ap-actual ) ; END 5 si ntact-compl eto: =Ni 1 ;
END; END; END;
; IN € Empieza a n a l i s i s s intact ico s i es tota l llama a l sintatac-completo 9 I h1 i si s-sintacti co: =Ni 1 ; tot a l THEN anal i si 5-si n t act i to: =si n t act -compl eto ;E l ex ico ; ); I
I
Programa VER I F I CADOR
I)ROCEDURE inicial iza-inter-reductor; BEGIN
tope := O; { limite del vector de especiales 2 ult-dag-espe :=O! {Limite en el dag de especiales 3 ultimo:=O; C apunta al ultimo renglon de la tabla 3 ap-prim:=l;€ Apunta al primer renglon activo de la tabla 3 ult-tab-str:=C~$C apunta ai primer STRING de l a tabla de STRING3
END ; 6 )
3OCEDURE verificador (actuai:apunt-2) ; INST
(PE
\R
TOPE = 20;
pila = ARRAYCl..TOPEl OF cadena;
pila-wp,cond-inv :pila; limite,lim-con,contprt : INTEGER; wp,pre,post,post-cmd, wp-ini :cadena; corta : BOOLEAN;
‘rocedimiento que despliega la ventana Superior 3 PROCEDURE ventana-sup; BEG IN marco ( 1 1 , 79,5, 1 1 ; Window(2,2,78,4) ; Textcolor (COLOR-1 1 ;TextBackground (COLOR-4) ; GoToXY (1,l) ; ClrEol ; GotoXY (20,l) $ Write ( ’ Con juntos actual es de verif i caci ón’ 1 ;
GotoXY(1,3);Write(’ Post-Condici6n : ’ I ; Textcolor (COLOR-2) ; TextBackground (COLOR-1) ; END ;
GotoXY (1,2) g Wri te ( ’ Pre-Condici 6n : ’ I ;
Procedimiento que despliega la ventana inferior 3 PROCEDURE ventana-inf;
BEG I N marco(J,20,79,25,1); Window (2,21,78,24) ; ClrScr i Textcolor (COLOR-1) ; TextBackground (COLOR-4) ; GoToXY(1,l)~ClrEol;
Write(+Conjuntoa de verificacibn proporcionados por el usuario’)$ Textcolor (COLOR-2) : TextBackground (COLOR-1) ; END;
GOtOXY (10, 1) 3
+ocedimiento que desplieaga la ventana donde va la seccibn del arograma que se verifica > ’ROCEDURE ventana-med; BEGIN marco ( 1 , 5,79,20,2 ) ; Window(Z,6,78,19); ClrScr; TextColor (CW-OR-1) ; TextEackground (COLOR-4) ; OoToXY (1,l) 3 ClrEol ; GotoXY (15,l) 8 Write(’Seccibn del programa que SET verifica’); TextColor (COLOR-2) 5 TextBackground (COLOR-1 1; END;
Programa VERIFICADOR
€ Procedimiento que despliega la pan ta l l a de presentacidn de
PROCEDURE pantal la-presentacion; los resul tados ' 3
BEG IN Window (l,l, 80,25) ; C l r S c r ; vent ana-sup ; vent an a-med ; ventana-inf; END;
C Procedimiento que da opcibn para co r ta r l a ejecucidn en caso
DROCEDURE error; de e r r o r en l o s conjuntos de v e r i f i c a c i h 3
BEG IN marco(20,22,60,24,3) ; Window(21,23,59,24); TextColor (COLOR-5+16) ;TextBackground (COLOR-4) ; GotoXY(1,l) jC l rEol ; GotoXY (2, 1 1 ; Write('Desea supr imir l a Ve r i f i cac ion S IN ' ) ; REPEhT
GetChar (carac ter ) ; IF NOT(UpCasetcaracter) I N C'S' , " '1) THEN Write(BEEP1;
UNTIL UpCase(caracter) I N C'S' ,'N" 3 ; I F Upcaoe(caracter)= 'S" THEN corta:=True; TextColor (COLOR-2) ; TextBackground (COLOR-1) ; END;
C Procedimiento que escr ibe una cadena e i n s e r t a una l i n e a si
>ROCEDURE escst rn (reng1on:cadena) ; JCIR i , f i n : INTEGER;
l a cadena no cabe en el renglon 3
BEG I N i:=l; fin:=Length(renglon); While i < = f i n DO BEGIN
Wr i t e ( rengl on C i 3 1 ; I F WhereX=ElO THEN BEGIN
W r i te ln ; InsLine;
END; i I =i +l ;
END; END;
t Procedimiento que escr ibe una cadena en papel 3 >ROCEDURE escp r t s t rn (renglon: cadena) ; IAR i, f i n ; INTEGER;
BEGIN ii=l; +i n : =Length (rengl on 1 ; While i < = f i n DO BEGIN
W r i t e (1 st , reng l on C i 3 1 ; IF c o n t p r t ~ 7 0 THEN BEGIN
Wri t e í n (1 st) ; contprt:=0;
END; i : =i + t i con tp r t 'I =contpr t+ l ;
END 8
Paq. 17 J.&.E.M. - -- L-
Programa VER I F I CADOR
C Procesimiento que lee una cadena d e caracteres 3 PROCEDURE lee-cad(VAR cad:cadena); VAR cad-inte :cad-expres;
BEG IN Deletetcad, l ,Length(cad) 1; REPECIT
cad: =lee-val (SO, T-ALNUM) i IF Length (cad)=O THEN BEGIN
Write(EEEP1; Gotoxy(WhereX, WhereY-1) ;
END; UNTIL Length (cad) < >O; cad-inte:=Copy(cad, l,Length(cad) 1;
C ap-daql:=reduce(cad-inte) ; 3 < cad:=Copy(cad-inte, l , Length (cad - i~ ie ) I ; >
IF(Length(cad)=O) THEN ventana-inf j
END;
.C Procedimiento que despliega en panta l l a l a informaciSn necesaria: sector del programa, pre-condición, post-condicidn y opci dn de
PROCEDURE escr i be (act : apunt -2; ti PO: CHAR) ; VAR prim,ap-reser :apunt-2;
cont,i,posx,posy:INTEGER; par a : BOOLEAN;
corte de l a proposicibn que se v e r i f i c a 3
< Función que regresa un apuntadores apuntador 2 proposiciones m a s a r r i b a de la proposición que se v e r i f i c a 3
FUNCTION sube-2 (actual apunt-2; Üar cont: INTEGER) : apunt-2; BEGIN cont:=O; WHILE ~ c o n t ~ 2 ~ A N D ~ a c t u a l h . h n o ~ ~ N I L ~ DO BEGIN
cont:=cont+l; actual :=actual*. hno;
END; sube-2: =actual ;
END;
C Fuci6n que escr ibe el t i p o de proposición 3 PROCEDURE esc-prop (apunt: apunt-2) ;
CCISE tipo-prop O F AiWrite (var ia ,* = ',expre)~ St Wri te ( 'SI * , cond-s, ' Ct Write ( ' MIENTRCSS ' , cond-c , ' HAGA' ;
BEGIN WITH apunt* DO
ENTONCES' 1 ;
END; END #
PROCEDURE puntos3 BEG IN FOR i:=l TO 2 DO BEGIN
Got o x y ( posx , posy 1 ;
posy:=WhereY+l; Wri t e l n ( ' g . E');
END j END:
Programa VERIFICADOR
C Función que regresa un apuntador a l padre ma5 externo de l a proposi c i ón ’r
FUNCTION BEG IN
prim-pad (actual : apunt-2) : apunt-2;
Whi l e actual”. padre< >Ni 1 DO actual :=actual*. padre; p r i m-pad: =actual ; END;
C Procedimiento que escr ibe l a parte del proqrama donde es ta l a proposición que 5e v e r i f i c a 3
PROCEDURE esc-sec-pro; BEGIN Window (297,78, 19) ;ClrSCr; GotoXY(5,l) ;Write(’EMPIEZA’);
prim: =sube-2 (act y cont) ; ap-reser : =pr i m-pad (pr i m) ; IF ap-reser”. hno< >NI1 THEN puntos; IF prim*.padre<>NIL THEN BEGIN
Gotoxy (posx, posy) ; esc-prop (prim-“.padre) 5 I F prim*.si-no=l THEN Write(’ OTRO’);
posy: =WhereY+l;
Writeln(’Empieza’1; posy:=WhereY+l; IF prim*.hno<> N i l THEN puntos;
posy: =2; posx : =5;
f305X:=1O;
GOtOxy (POS% y P05y) j
END; i :=O; WHILE ( i <=2+cont 1 AND (pr i m< >NIL) DO BEGIN
Gotoxy (posx I posy) ; esc-prop (prim) ; IF primxact THEN BEGIN
TextCol or (COLOR-3) ; IF tipo=’S’ THEN BEGIN
Gotoxy (posx posy) : InsLine; escstrn (wp) ; posy:=WhereY+l;
END; Gotoxy(I,po5y); Write(’=>’)i Gotoxy (posx , WhereY+l) ; InsLine; escstrn (post 1 ; Textcolor (COLOR-2) ; posy: =WhereY+l;
END; i :=i+l; posy: =WhsreY+li p r i m: =pr i m̂ . ant p
END : IF prim-Nil THEN BEGIN
Ootoxy(posx,pPsy) 3 Write( ’Fin’1;
END; END 8
Programa VERIFICADOR
C Empieza el procedimiento escr ibe 3 BEGIN IF t i p o 0 ’ C ” THEN BEGIN
W i nd0.w (20 3,78 , 4) ; C1 r Scr ; GotoXY ( 1 , 2 1 ; escstrn (post 1 ; esc -sec -pro;
END; para:=True; Window (2, 22,78,24) ; ClrScr; GotoXY ( 2 , l ) ; CASE t i p o OF
’S I : BEGIN C Despliega precondición de l a proposicidn 3 Window (20,3,78,4) ; Gotoxytl, 1); escstrn (wp) ; Window (2,22,78,24) ; END ;
Write( ’ ( ’ ) ; escstrn ( c o n d ~ i n v i l i m ~ c o n l ) ; óeecprtstrn (cond-invLlim-conI); 3 Write(’) AND (’1; IF tipo=”C’ THEN BEGIN
’ C ’ , ’ F ’ : BEGIN C E l usuario v e r i f i c a l a implicacidn 3
Write( ’No ’1; Write (1st , ’ No ’ 1 ; 3
END; escstrn (act”. cond-c 1 ; Write(’) => ’1; escstrn (wp) ; escprtstrn(act”.cond_c); Wr i te (Lst , ’ ) => ’ ) ; escprtstrn(wp); Wri t e i n (1 st) ; contprt : =1; 3.
END; ’ W : BEGIN .: E l usuario entra l a condicidn invariante del c ic lo3
para: =Fa1 se; REPEAT
Window(2,22,78,24); ClrScr; GotoXY (2, l ) ; Textcolor (COLOR_2+16) ; TextSackground (COLOR-3) ; GotoXY(1,l); C l rEol ; Writeln(’Cua1 es l a Condicion Invariante’ ) ; TextColor (COLOR-2) ; TextBackground (COLOR-1 1 ; Delete tcond-i nv C 1 i m-con 3 , 1, Length (cond-i nvC 1 i m-con 3 1 1 ; 1 ee-c ad ( cond-i nv C 1 i m-con 3 1 ;
UNTIL(Length (cond~invCl im~con3) >O) ; END;
END; IF para THEN BEGIN
Write (BEEP) 3
IF Upcare (caracter 1 = Char (27) THEN error; Getchar (caracter) ; -
END; END 5
‘ROCEDURE inserta-parentesis (VAR expre: cadena) ; BEG IN
Programa VERIFICADOR
I n s e r t ( ‘ ( ’ ,expre, 1 ) ; I n s e r t ( ’ 1 ’ ,expre,Length (ewpre)+l) ; END;
Función que busca una palabra e l un renglon 3 UNCTION busca(palabra,expre:cadena; i n i : INTEGER): INTEGER; ’AR encuentra :BOOLEAN;
pos-pal , pos : INTEGER; BEG I N encuentra:=False; C No encuentra 3 WHILE ( i n i <=Length (expire) -Length (pa l abra) +1) AND ( Not encuentra) DO BEGIN
pos: =i n i ; pos-pal : =l ; € Compara l e t r a por l e t r a 3 WHILE (pos-palc-Length (palabra) )AND (palabraCpos-pal3=expreEpos3) DO BEG
pos:=pos+l; pos-pal : =pos-pal +l ;
END; IF pos-pal $.Length (palabra) THEN encuentra:=True ELSE i n i : = i n i + l ;
END; I F NOT encuentra THEN ini:=Length(expre)+i: .: No encuentra 3 busca:=ini;< regresa pos 1 l e t r a de l a palabra en el renglon 3 END;
. Procedimiento que v e r i f i c a una proposic ión e5 recurs iva para
‘ROCEDURE proposic ion (actual :apunt-2) : PAR pos :INTEGER;
padre : apiint-2; aux zcadena;
proposiciones que t ienen h i j os , (seleccibn c i c l o s 1 3
BEGIN € Guarda en l a p i l a l a wp (precondición mas d e b i l 3 1 imi tes =1 i m i te+ l ; p i 1 a-wpC 1 i m i te3: =Copy (wp, 1 , Length (wp) 1 ; CASE actual*.t ipo-prop OF
A:BEGlN 4 Caso de asignacidn 3 pos: =o: pos8 =busca (actual *. var i a, wp y pos) ; WHILE pos<=Length (wp) DO BEGIN
Delete (wp , pos, Length (actual ”. var i a) ) ; I n s e r t (actua l * . expre, wp, pos) ; posr=pos+Length (actual*.expre); post =burica (actua l v a r i a, wp y pos) ;
END; pre: ‘Copy (wp, 1 , Length (wp 1 1 ; END;
GIBEGIN € caso de selección 3 padre: =actual ; actual:=actuai^.hi jo-s-si; C V e r i f i c a l a pa r te del entonces 3. WHILE (actual<>Nil)AND (Not cor ta ) DO BEGSN
ptoposic ion tactual 1 ; IF Not cor ta THEN escribe(actua1,’S’); actua l :=actual*.hno;
END; C Cuarda en l a p i l a 9 1 i m i te: =1 i m i te+ 1 ; p i 1 a-wp C 1 imi te ] : =Copy (wp, 1 , Length (wp) 1 ; wp: =Copy ( p i la-wpC1 i m i te-1 3 , 1 , Length ( p i 1 a-wpC1 imi te-1 3 ) 1 ;
--
Programa VERIFICADOR
actual z =padreh. h i jo-s-no; C V e r i f i c a en l a parte del otro si l a hay 3 WHILE (actual<>Nil)AND (Not corta ) DO BEGIN
proposicion (actual 1 ; IF Not corta THEN e s c r i b e ( a c tua l , ?S ’ ) ; actual :=actual *. hno;
END; 1 imite: =l irni te+l; IF padre^.hijo-s-naO NIL THEN
ELSE
actual :=padres C Encuentra wp de l a selecidn ut i l i zando el teorema 3 wp: =Copy (pi 1 a-wpC 1 i m i te-1 3 , 1, Length (pi 1 a-wpC 1 i m i te-1 3 1 ; inserta~parente~is(actual*.cond~s~ ; i nserta-parentesi s (wp 1 ; wp:=Concat (wp, ’Y*,actual*.cond_s) ; i nciert a-par ent esi s ( wp 1 ; IF actual*.hijo-s-no <>. NIL THEN
ELSE inserta-parentesis(aux1; aux:=Concat (aux, ’NO’,actual*.cond-s); i nsert a-parent esi s ( aux 1 ; wp:=Concat (wp,’O*,aux) 3 1 imite: =1 i m i te-1; pre:=Copy(wp,l,Length(wp)); END;
1 i m-con: =1 i m-con+ 1 ; C pide al usuario l a condicidn invar iante 3 escr ibetactua1, ’N’ ) ; € pide a l usuario v e r i f i c a r l a implicacidn para
escr i be ( actual , ’ C* ; padre: =actual ; actual : =padreh. h i jo-c; wp: =Copy (cond-i nvCl i m-cern3 , 1, Length (cond-i nvCl i m-con I1 1 ; post : =Copy (wp, 1 , Length (wp 1 ; C v e r i f i c a l a proposición del c i c l o 3 WHILE (actual<>Nil)AND (Not corta ) DO BEGIN
proposicion (actual 1 ; IF Not Corta THEN escribe(actua1, ’S ’ ) ; actual :=actual*. hno;
p i 1 a-wp C 1 imite]: =Copy (wp, 1 , Length (wp)
Delete (pi 1 a-wpC1 irni te], 1 , Length (pi 1 a-wpC1 i m i te3 1 1 ;
aux : =Copy (pi 1 a-wp C 1 i m i te 3 , 1 , Length (pi 1 a-wp C 1 i m i te 3 1 1 dux : =Copy (pi 1 a-wp C 1 i m i te-21,1, Length (p i 1 a-wp C 1 i m i te-21 1 ;
C:BEGIN C caso del c i c l o 3
entrar al c i c l o 3
END; actual :=padre; IF Not cor ta THEN escr ibe (actua l , *F*1 ; wps =Copy (cond-invC1 i m-con3 , 1 ,Length (cond-invCl im-con31 1 ; 1 im-con: =1 im-con-1 ; END ;
END; post: =Copy (pi la-wpC1 irni te3,l,Length (pi la-wptl irni te31 1 ; 1 irni te:=l irni te-1; END :
;IN € Empieza el procedimiento ver i f icador 3
)anta1 1 a-presentaci on 3 I i m i te: =O;
I n i c i a i i r a v a r i a b l e s 3
Programa VERIFICADOR
con t pr t : = 1 ; 1 i m-con 3 =O; Delete(post-cond, 1,Length (post-cond) 1; Delete(wp-ini,l,Length(wp-iniI 1; REPEAT
Window(2,22,78,24) ; T e x t Col or (COLOR_S+ i 6) ; T e x t Bac kgr ound (COLOR-4 1 ; GotoXY ( 1 , l ) 3 ClrEol ; Write ln ( ’ Escriba l a postcondición del programa’); TextColor (COLOR-2) ;TextBackground (COLOR-1) ; WritetBEEP); lee-cad (post-cond) ; post:=Copy(post-cond, 1,Length (post-cond) 1;
JNTIL Length (post-cond) >O: X r S c r ; REPEAT
Window (2,22,78,24) ; TextColor (COLOR-3+16) ; TextBackground (COLDR-4) i GotoXY(1,l); C1 rEol ; TextColor (COLOR_3+16) ; TextSackground (COLOR-4) j
GotoXY ( 1 , l ) ; C1 rEol ; Writeln( ’Escriba l a PrecondiciSn del programa’); T e x t Col or (COLOR-2) j T e x t Eac kground (COLOR- 1 1 ; Write(BEEP1; lee-cad(wp-ini); wp : =Copy ( post -cond, 1 , Length (past -c:and ) ) ;
JNTIL Length (wp) >O; Zorta: =FALSE; C mientra hay proposiciones encuentra l a precondición 3. rJHILE (actual< >Ni 1 1 CIND (Not corta) DO BEGIN
proposicion(actual1; IF Not corta THEN escribe(actua1, ’S ’ ) ; actual I =actual *. hnos END;
tF Not corta THEN BEGIN Window(2,22,78,24); ClrScr ; GotoXY (5,2) j Writeln( ‘La s iguiente proposicion se cumple S/N’:30) g escstrn (wp-ini 1 ; Write(’ => ’1; escstrn(wp1 3
escprtstrn (wp-ini) ; Writetlst,’ => ’1; escprtstrn (wp) 3 Writeln(1st ) : 3
REPEAT Read(Kbd,caracter); IF Not(UpCare(caracter) IN C’S’, ’N’J) THEN WritetBEEP);
UNTIL UpCase(crracter) IN C‘S’,’N23: Window( 10,22,70,2S) 8 ClrScr ; marco ( 10,22 y 70 y 25,2 1 ; TentBackground (COLOR-4) ; Window( 11,23,69,24) 3 C1 rScr ; GotoXY (1 1,2) ; IF UpCasetcaracter) = ’S’ THEN BEGIN C Programa correcto 3
Programa VERIFICADOR
TextCo1 or (COLOR-3) ; Write( ’ ******$ E í programa es correc to S S t S X t l r ’ ) ; Write (BEEP) ; Getchar (caracter ; TextCol or (COLOR-2) ; TextBackground (COLOR-1) ;
END ELSE BEGIN .I Programa con e r r o r regresa el e d i t o r para au modificación1
TextColor (COLOR-5) ; W r i t e ( ’ S t t t t S % * EL Programa t i e n e e r r o r t t f % t * S ” 1 ; c o r t a ? =True; Write(BEEP1; Getchar (carac ter ) ; TextColor (COLOR-2) ;TextSackground (COLOR-1 1 ; Window ( 1 , 1,8O,25) ; CcreenEdi tar ( ’ E‘ 1 ;
END; END ELSE BEGIN
Window ( 1 , 1 , 80,25) ; S c r e e n E d i t o r ( ? € ’ ) ;
END; END;
_ -
Programa Reductor
‘rocedimiento para e s c r i b i r un conjunto 3 :RLAY procedure escribe-conjunto(conj:tipo-conjunto);
i n
f i IN conj THEN wr i te ( i :4 ) ; teln;
1;
i : inteqer ;
i .- .-1 TO v-grande do
rocedimiento que cambia valores de l a s Constantes entre el s intact ico I el reductor en l a parte del a n a l i s i s s intact ico ICEDURE conv-1 e x (VAR toq-equi : INTEGER) ; : ap :apunt-2; BEGIN I F lee THEN BEGIN
3
toq-equi :=O; ap: =anal isi s,sintñctico(False) j
CASE toquen OF 5: toq_equi:=40; .: ( 3 6: toq_equi:=41; < 1 3
14: toq_equi:=59; .: ; 3. 15: I F compara (palabra, ’NO’ 1 THEN
16: toquen:-O; € FIN de expresion 2 19: BEGIN €Identi f icador>
toq-equi 2 =126; €Iy, Negaci 6n 3.
toq-equi : “4; IF (compara(palabra,’VERDAD’) )OR(compara(pñlabra, ‘FALSO’)) THEN
END; toq_equi:=3; CBOLEANA 3
203 toq-equi : =2; C Numero] 22: toq_equi:=91; <E3 23s toq_equi:=93; C 3 3 25: toq-equi : =58; 6: 3 3: CASE Otd(palabraf í3 ) OF €Adicion3
124,79,311 :toq-equiP= 1241 C :,O,o 3 43,45 :toq-equi:= ürd(palabraCl3) ; C +,- 3
ELSE: END;
4: CASE Ord(palabraf l3 ) OF CMultiplicador3 38189,94,121 :toq-equi:= 38; C & , * , y , Y >
47,42 :Toq-equis= Ord(palabraEl3) ; C X,/ 3 ELSE ;
END; 17z CASE tipo-sin OF €Operador de re lacibn3
7 :toq-@qui:= 60; C < 3 8 :toq-equi:= 61; € = 3 9 :Toq-equi:= 623 C > 3
10 :toq-@qui:= 2433 C 5 3 11 rtoq,equii= 2423 C L > 10 :toq-@qui:= 2431 C I 3 21 :toq-equi:= 216; C t 3 ELSE
END; ELSE
END; END ELSE 1 ee: =True; END;
uncidn que regresa el s iguiente elemento de un conjunto ordenado 3
--
Programa Reductor
FUNCTION siguiente-elemento(u1t: INTEGER; VCIR con j: tipo-con junto): INTEGER; BEGIN REPEAT u1 t : =Succ ( u1 t 1 ; UNTIL (ult IN conj)OR(ult>v-grande); siguiente-elemento:=ult; END;
procedimienta que recorre y guarda en un conjunto todas las ramas o hojas de un mismo OPERador 1 PROCEDURE llena_conjunto(apt,oper: 1NTEGER;VAR conj: tipo-conjunto) ;
BEGIN I F (tabl aLapt , TIPOI=INTERNO) AND (tabl at apt, VALORJ=oper 1 THEN BEGIN
1 1 end-con junto (tab1 aC apt I I ZQ3 oper , con j 1 ; llena~conjunto(tablaLapt,DER3,oper~conj);
END ELSE con j : =conj+Capt 3 ; END;
Procedimiento que busca y cambia los apuntadores de un nodo viejo a un nodo nuevo d e la tabla 3
ROCEDURE busca-cambi a-tabla ( v i e j o , nuevo,numero-apt: INTEGER;
AR i ,cuenta : INTEGER; W R tab1:matriz);
BEG I N
cuenta:=0; WHILE (i~=ultimo)~ND(cuenta~numero-apt) DO BEGIN
i:=1* I
IF tablCi,ÍZQl=viejo THEN BEGIN tablCi, IZQI:=nuevo; cuenta: =cuenta+ 1 ;
END; IF tablLi,DERl=viejo THEN BEGIN
tablfi,DERl:=nuevo; cuenta:=cuenta+i;
END; i.- .-i+i;
END; t ab1 C nuevo, CONT 3 : =t ab1 [nuevo, CONT 3 +cum t a; END;
Funcidn que Regresa un conjunto con los renglones del D.A.G. que son
NCTION 1 lena-uti 1 (papa: INTEGER; VAR uti 1 : tipo-con junto; VCIR tab-uso: rnatri z ) : INTEGER;
R conta: INTEGER;
utilizados para compactar el D.A.G. 3
BEGIN contat=O; I F tab-usoCpapa,IZP3>0 THEN
IF tab-usoCpapa,DERI>O THEN
I F Not (papa IN uti11 THEN BEGIN
END; ilena-util:=conta; END;
conta: =1 lena-uti 1 (tab-usoCpapa, 1201, uti 1, tab-uso) 3
conta: =conta+l 1 ma-ut i 1 (tab-usotpapa, DER3 , uti 1 , t ab-uso) ; conta:=conta+l; ut i 1 : =ut i 1 + C papa 3 ;
Programa Reductor
rocedimiento l a seccidn de l D.A.G. ap: apuntador a l a r a i z del dag que se va a compactar; i n i e5 el limite
ERLAY PROCEDURE compacta-dag(VAR ñp,ultimo:INTEGEk;VAR tab-uso:matriz;
R tot_util,ap-ult,ap-prim,i, j , k :INTEGER;
inferior desde donde se va a qurada r el dag compactado)
i n i : INTEGER) ;
u t i 1 , l i b r e : tipo-conjunto; BEG IN 1 ibre:=C 3 ;
tot-ut i 1 : -1 1 ena-uti 1 (ap , ut i 1 , tab-uso) ; ap ,pr i m : =O ; FOR i:=l TO v-grande DO l i b r e : = l i b r e + C i 3 ; IF ini>O THEN
FOR i := l TO IN1 DO l ibre := i ibre -Ci l ; l i b r e : =i ibre-uti 1 ; i :=O; WHILE i<=v-grande DO BEGIN
u t i 1 :=c 3 ;
i . - . -siguiente-el emento ti, u t i i 1 ; IF (i<=v-grande)AND(i >tot-utii+ini THEN BEGIN
j : =siguiente-elemento(O, 1 ibre) j I F i=ap THEN ap:=j; 1 i bre: =1 ibre-t j 3 ; FOR k : = l TO LON-L DO BEGIN
tab-uso[ j 3 C k I : =tab-usoC i 3 C k 3 ; tab-usoti I C I: 3: =O;
END; busca-cambia-tabla(i, j,tab-usoC j,CONTI,tab-uso);
END; END; u1 t i mo: =tot-uti 1 +i ni ; END;
FUNCTION busca-str (VAR palabra: CADENA) : I VhR j : INTEGER;
termina: BOOLEAN; BEG I N j:=l; termina: =Fa1 se;
JTEGER;
WHILE (j<=ul t-tab-str 1 CIND (Not termina) DO BEGIN
END; IF Not termina THEN BEGIN
IF compara(palabra, tab-strCJ3) THEN termina:=True ELSE j 8 =j+l;
ult-tab-str:=ult-tab-str+l; tab-str tul t-tab-str 3 : =Copy (pal abra, 1, Length (palabra) ) ; j:=ult-tab-str;
END; busca-str:=j; END;
rocedimento que escr ibe l a t a b l a desde el i n i c i o hasta el ltimo renqlon act ivo 3 PROCEDURE esc r i be-tabi a (u1 ti mot i nteger ; VAR tab1 a: matri z 1 ; VRR x , y :INTEGER;
BEG I N FOR x : = l TO ultimo DO BEGIN
Write ( x 1 ;
Programa Reductor
FOR y:=l TO LON-L DO wri te(tablaCx,y3:4) ;
I F tablaCx,T1P03=IDENTI THEN Wr i tetab-str C tab1 al:< , VALOR3 3 : 10) ;
Wr i te1 n; IF (x MOD 20)=0 THEN read(kbd,caracter); END; read(kbd,caracter); END;
’rocedimiento que escribe el tipo de ERROR 3 PROCEDURE errar (numero: INTEGER) ;
BEGIN IF Not err THEN BEGIN
Wi ndow (2, 22, 78, 25) ; C1 rScr ; marco(2,22,78,25,2) ; TextBackground(l5) ;Textcolor ( O ) ; Wi ndow (3,2J, 77,24) ; Cl r Scr ; GotoXY(5,l); CASE numero OF
O:Writeln(’t*Y ERROR S t f Espera una EXPRECIO SIMPLE’); i:Writeln(’tXt ERROR ttt Espera un TERMINO’); 2:Writeln(’SSS ERROR # f S Espera un FACTOR’); 3:Writeln(’ttX ERROR X S t Espera un (SUM) “F.”’); 4:Writeln(’$ttt ERROR X t t Espera un <I> “CORCHETE DERECHO”’); S:Writeln(”ttX ERROR btS Espera un ( 0 . “PARENTESIS IZQUIERDO”’); ó:Writeln(’ttt ERROR S f t Espera una VARIABLE’); 7rWriteln(’ttt ERROR t t t Espera .<:> “DOS PUNTOS”’); 8:Writeint’Jff ERROR YtX Espera un IDENTIFICADOR’); 9rWriteln(‘#*t ERROR t t t Espera un OPERADOR DE RELACION’); lO:Writeln(’ttS ERROR 4 $ $ Espera la VARIABLE: ‘,contraía); ll:Writeln(’ttt ERROR XXt Espera la 0 ) ”PARENTESIS DERECHO”’); 12: Wr i te1 n ( ‘ t t t ERROR t t t TOQUEN No def i ni do’ , toquen: 4) ; 13:Writeln(’ttt ERROR ttl: EXPRESION no recursiva‘); 14: Wri teln ( ’ t S S ERROR X S X DIVISION en O’ ) ; 15:Writeln(’ttS ERROR aXt Espera “FACTOR”’); lb:Writeln(’SSt ERROR S t t Espera “FACTOR SIMPLE”’); 17: Wri tei n ( ’ ttt ERROR t t t Espresi 6n I’ INCOMPLETA” ’ 1 ;
1; 18:Writeln(’ttt ERROR t t t Espera IGUAL ” = I s p
END3 fen-err:=renglon; y-err : =ap-i t q ; err : =True; TextBackground(0);Textcolor (15);
END; END;
C Función que regresa el valor de prioridad de un operador 3 FUNCTION prioridad (ap: INTEGER) : INTEGER;
BEG I N CASE tablaLap,VALOR3 OF
C ~ M f A Y O R , C ~ M E N O R , C ~ I G U A L , M A Y ~ I ~ , M E N ~ I ~ , C ~ D ~ F E R 8 pr i or i dad : =O;
NO8 pr i ori dad: =I 3 RESTA: pr i or i dad : “33
SUMfA, Y: priori dad: =2; O, MULT: pri ori dad: =4;
D1VI:prioridad: =5;
COP-REL3
ELSE END;
Programa Reductor
END;
C Procedimiento que recorre el D.A.G. (en entre orden 1 para obtener
PROCEDURE rec-anterior (ap: INTEGER; VAR str-cadena: cad-expres;
VCIR parentesi s : BOOLEAN; str-aux :STRINGC103; h i j o : INTEGER;
1 a expresi ón reducida
VAR tab larmatr i t ) ;
BEGIN CASE tabiaCap,TIPOJ OF INTERNO: BEGIN
parentesis:=False; h i jo : =t ab1 a E ap , I ZQ I ; IF h i j o t X THEN BEGIN
J is i ta el h i j o Izquierdo 3 I F tab1 aChi jo, TIPOl=INTERNO THEN
inserta parentesisi para dejar l a pr ior idad de 105 operadores 3 I F prioridad(ap1 >pr ia r idad (h i j a ) THEN BEGIN
str-cadena:=Concñt (str-cadena, ' ( ' 1 ; parentesis: =True;
END; rec-anterior (hi jci, str-cadena, tabla) j
END; IF parentesic, THEN
str-cadena: =Concat (str-cadena, ' 1 ' 1 ; l i s i t a e l nodo 3
str-cadena: =Concat (str-cadena,Chr (tablaCap,VhLOR3) 1 ; parentesi s: =Fa1 se; hi j o: =tab 1 a C ap , DER 3 5 IF h i jo<FO THEN BEGIN
l i s i t a e l h i j o derecho 3. IF tablñChijo,TSP03=INTERNO THEN
I F prior idad (ap) >prioridad (h i j o ) THEN BEGIN inserta parentesis para dejar l a prioridad d e 105 operacores
str-cadena:=Concat (str-cadena, ' ( ' 1 ; parentesi 5 : =True:
END : rec-anterior ( h i jo,str-cadena,tabla) ;
END; IF parentesis THEN
END; str-cadena:=Concat (str-cadena, ' 1 ' 1 ;
Si el nodo que v i s i t a es una hoja 3 IDENTJ: BEGIN
SF tabiaCap,ESTADOl=NEG-~RIT THEN st r -c adena : =Cox at ( st r -cadena,
' (-',tab_strCtablaCap,VALOR33,")"1
ELSE IF tablaCap,ESTADOI=NEGJ3OL THEN
str -c adena: =Cancat (str -c adena, ' I"' , t ab-str C t ab1 a i ap VALOR3 3 , ' 1 ' 1
ELSE str-cadena: =Concat (str-cadena, t ab-str f t ab1 aC ap , VALOR1 3 1 ;
END; NUMERO : BEG I N
Stir (tabiatap,VALORlo 10,str-dux) ; WHILE Ord tstr-dux C 13 1 =32 DO de le te ístr-aux , 1 , 1 ) ; IF tablaCap,VhLORI ( 0 THEN
Programa Reductor
str-cadena:=concat (str-cadena,' ( ' ,str-aux, * 1 ELSE str-cadena: =concat (str-cadena, str-aux) END;
BOLEANA: IF tablaCap,V~LORJ=VERDAD THEN str-cadena:=Concat (str-cadena, (VERDAD) ' 1
ELSE str-cadena:=loncat (str-cadena, ' (FALSO) ' 1; END ; END;
'rocedimiento que b o r r a un renglon d e l a t a b l a donde e s ta el DAG> PROCEDURE 1 i mpi a-t up1 a (apt : INTEGER) ; VAR i : INTEGER;
BEG I N FOR i :=l TO LON-L DO tab iaLapt , i l :=0 ; tablaCapt,TIPOl:=VACIO; END;
+ocedimiento que l i g a un nodo con sus hi jos 3 PROCEDURE apunta(padre,h-izq,h_der:INTEGER);
REGIN t ab1 alpadre, I ZQJ : =h-i zq ; tablaEpadre,DERJ:=h_der; t ab1 at h-i zq , CONTI : =tab1 at h-i z q , CONT 3 + 1 ; t ab1 aCh-der , CONTI : =tab1 alh-der , CONT 1 + 1 ; END;
-0cedimiento que borra una rama del DClG 3 PROCEDURE borra-ramatapt: INTEGER);
BEGIN I F ( tablatapt , CONTl<=l) THEN BEGIN
i m p i a el nodo porque no t i ene otro padre, y, t r a t a de limpiar a sus hijos 3 I F tab la fapt , IZ153<>0 THEN borra_rama(tablaCapt, I Z Q 3 ) ; IF tab l aC apt , DERIÉ >O THEN borra-rama (t ab1 aC apt, DER3 ; limpia-tuplatapt 1 ;
END
ELSE tab l at apt , CONTI : =t ab1 aC apt , CONTI-I ; END;
Elimina un padre >
incion que busca secuencialmente un nodo en l a t a b l a desde un renglon 3icia l dado ( i n i c i o ) hasta que l o encuentre ó l l e g e a l ultimo d e l a i b l a y regresa l a direction ó O 3 FUNCTION busca~nodo(vlr,tip,est,inicio:3NTEGER):INTEGER~:INTEGER; VAR i,ap-str : INTEGER!
encuentra : BOOLEAN3 BEGIN encuentras =Fai set i r r i n i c i o ;
3usqueda secuencia1 hasta el f i n a l de l a t a b l a act iva o hasta que en :uentre el nodo >
WHILE (i<=ultimo)AND(Not encuentra) DO BEGIN I F ( tabl aCi , TIPOJ=ti p) AND (est=tabl a t i , ESTADO 3 1 THEN BEGIN
IF (tipiIDENT1) and (compara(tab_~trCtablaCi, VALORJ3,palab-auxi 1) THEN encuentra: =True;
IF ( t ip< > IDENT I ) AND (tab1 a C i , VALOR J=vl r 1 THEN encuentra: =True:
END; S i el nodo no es, v e r i f i c a si es ta l i b r e para de ja r a l lpuntador "LIBRE" a l primer nodo l ibre de l a t ab l a 3
IF Not encuentra THEN BEGIN
Programa Reductor
IF (t ab1 a C i , TIPO l=VAC IO 1 AND ( ( 1 i bre=O) OR ( 1 i b r e > i 1 1 THEN
i:=i+l; l ib re := i ;
END; END 5 IF encuentra THEN busca-nodo:=i ELSE busc a-nodo: =O ; END;
Procedimiento que cambia l a s ramas 6 ho jas del DAG-2 que estan en e l DhG-1, haciendo ,un reco r r i do s ime t r i co 3 OCEDURE mezcla-dag(ap:INTEGER;VAR cabezr1NTEGER;VAR tab :mat r i t ) ; R ap-nvo, aux : INTEGER;
termina : BOOLEAN; EGIN ux : =u1 timo; F tabCap,TIPOI~~~INIERNO THEN BEGIN
I F ap>=ap-prim THEN BEGIN u1 t i mo: =ñp,pr i m-1 ; IF tabCap,TIPOl=IDENTI THEN
a p ~ n v o : = b u s c a ~ n o d ~ ~ t a b C a p , V A ~ O R l , t a b C a p ~ T I ~ O l ~ t a b C a p ~ E S T A D O l y l ~ ; u1 t imo: =aux ; IF (ap_nvo(ap_pr im)AND(ap-nv~~~) THEN BEGIN
pa l ab-aux i : =tab-str Ctabtap, VfSLORl3;
IF aprcabez THEN cabez : =ap-nvo; busca-cambi a-t ab1 a (ap , ap-nvo, tab Cap I CONTI tab ; l impia-tupla(ap1;
END; END;
ND LSE BEGSN
IF tabfap, IZQJO.0 THEN mezcla-dag(tabCap, lZQ3,cabez,tab); I F tab Cap , DER]< >O THEN metcl a-dag ( tab Cap , DER], cabez , tab) ; I F ( tab C ap , I ZQ3< ap-pr i m) 4ND ( tab i ap , DER1 C ap-pr i m) THEN BEGIN
ap-nvo, =o; termina: =Fa1 se; REPEAT
u1 timo: =ap-pri m-1 ; ap~nvo:=busca~nodo(tabCap,VfALOR3, INTERNO,
u1 t i m o i =aux ; IF ap-nvo(>O THEN BEGIN
IF (tabtap, IZQl=tabtap-nvo, 1 Z Q l ) A N D ( tab C ap , DER 3 =tab C ap-nvo DER3 1 THEN t ermi na: =Tr ue;
IF ( tab C ap , VALOR 3 IN conmuta 1 AND ( tab Cap, I Z Q l = t ab C ap-nvo, DER 3 1 fSND ( tab C ap , DER 1 =tab C ap-nvo , I ZQ3 1 THEN t e r m i na: =True ;
tabfap,ECTADoJ~ aP-nvo+l) ;
END j UNTIL (terrnina)OR(ap_nvo=0) ; I F termina THEN BEGIN
busca-cambi a-t ab1 a (ap, ap-nvo, tab C ap , CONTI, tab 1 ; I F cabezrap THEN cabez:=ap-nvo;
END; END; JD; 1 timo: =aux ; 4D;
Funcidn que escr ibe un operador a l f i n a l de
FUNCTION ubica-oper (oper: INTEBER) : INTEGERi - l a t a b l a regresa l a d i recc idn > .
-- I_
Prcjorama Reductor
BEGIN u1 ti mo: =u1 ti mo+ 1 j 1 i mpi a-tup1 a (u1 t i mcl ; tab 1 aCul ti ma, VALLlR3 : =oper ; tablaCultiinu.TIP03:=INTERNO; ubi c a- ope:" : =u1 ti mo; END: -
?uncibn que busca un nodo hoja regresa l a dirección, 5i el. t ipo de iodo e5 var iab le , el nombre de es ta e s ta almacenado en '1PALAB-AUX18i3 FUNCTION busca~hoja(vlr,tip,est:iNTEGER~:íNTEGER; VAR i, j : INTEGER;
termina :BOOLEAN; BEGIN i : =ap-pr i m; termina:=False;
WHILE ( i >O)CSND(Not termina) DO BEGIN i : =busca-nodo ( v l r , t i p , est, i 1 ; IF ( i - <>O ) THEN
3uc;ca secuencialmente en l a t ab l a 3.
IF ( tablaCi , IZBl=O)AND(tablaEi ,DERI=O) THEN
ELSE i:=i+l; END;
Si no esta crea un nuevo nodo 3 IF Not termina THEN BEGIN
termina:=True
IF l i b r e 0 0 THEN BEGIN ipunta a l primer nodo l i b r e de l a t a b l a ac t i va 3
i : = l i b re ; libre:=O;
END ELSE BEGIN
lo hay noda l i b r e entonces amplia l a t a b l a act iva 3 u1 t i mor =u1 ti mo+l ; i : =u1 ti mo;
END; 1 i mpi a-tup1 a ( i 1 ; t ab1 at i , ESTAD03 : =est ; IF tip<>IDENTI THEN BEGIN
t ab1 a t i , VALOR3 : =vl r ; t ab l at i , T IPOI : =ti p ;
END ELSE BEGIN
3usca el s t r ing en l a t ab l a de s t r ing si esta apunta a ese, ii no esta crea un nuevo s t r ing 3
jtrbusca-str (palab-auxi 1 ; tabl at i , VALOR3 : = j ; t ab1 a C i 1 IPOI : =IDENT I ;
END ; END I busca-hoja: si ; END;
kncibn que recarre l a t ab l a secuencialmente hasta encontrar un nodo .nterno, con hijo izquierdo "H-IZQ1' y h i j o derecho "H-DER", si el
FUNCTION recorre-tabla-secuencia1 (h-izq,h-der,
VCIR i : INTEGER;
)perador es conmutativo conmuta los h i j o s 3
vlr,tip:INTEGER):INTEGER;
Pag. 32 3.CI.E.M. I _ _ " 4 1 1
_ L _ . ~ P - I J - F Lv
Proqrama Reductor
termina :BOOLEAN; BEGIN terminatrfalse; i : 'ap-pr i m; WHILE (Not termina)AND(i >O) DO BEGSN
i:=busca-nodo(vlr,tip,FOSI,i); IF i-<>O THEN BEGIN
IF (tablati 12~3=h_izq)AND(tablaCi ,DERI=h-der) THEN
ELSE termina: =True
IF (vlr IN CONMUTAIAND (tablaCi ,DERJ=h-izq)
ELSE i:=i+ls AND(tab1aí.i , iZQI=h-der) THEN termina:=True
END; END; recorre-tabla-secuencia1 :=i END;
-uncibn que regresa un valor de verdad si el nodo apuntado es una io ja 3 FUNCTION apunta-hoja(ap:INTEGER):BOOLEAN;
BEGIN apunta-hoja: =Fa1 se; I F ap>Q THEN
IF tablaCap,TIP03~>INTEHNO THEN apunta-ho ja: =True;
END;
'rocedimiento que busca un nodo hoja con estado opuesto3 PROCEDURE cambia-estado(Vf4R hija:INTEGER;est:INTEGER); VAR ap, val : INTEGER;
BEG IN IF tablachi jo,ECTAD03< >.POSI THEN
val:=tablaChi jo,VALORI; IF tablaChijo,TIPOI=NUMERO THEN BEGIN
est : =POSI ;
val :=val iL (-1 1 ; est : =POSI ;
END ELSE palab-auxi : =tab-str Eva1 3; ap:=busca-hoja(va1 ,tablaChiJo,TfPG3,estl; hi jo: =ap f END;
Función que regresa el apuntador a una rama despues de combinar los operadores 3 FUNCTION nueva-rama(h-irq,h-der,vir:INTEGER):SNTEGER~ VAR ap: INTEGER;
BEG 3 N ap: =recorre-t ab1 a-secuenci al (h-i sq, h-der , vl r , INTERNO) 3 IF ap=O THEN BEGIN
END; nueva-rama: =ap; END ;
apsrubica-oper {vir); apunta (ap, h-i zq, h-der 1 ;
'unción que regresa una nueva rama si puede combinar el operador I * I 1 con los operadores ll&k" 6 3
I_. I- Paq. 33 3.A.E.M. - ._-- .."---u
FUNCTION combina-oper-bo1 (VAR hi jo: INTEGER) :BOOLEAN; VAR nue-irq, nue-der, nue-hi jo, vlr : INTEGER;
i nv : BOOLEAN; BEGIN vl r : =O; combi na-oper-bo1 : =Fa1 se; CASE tablaChijo,VALORl üF
Y,O : EEGIN IF tablaChijo,VALORI=Y THEN vlr:=O; IF tablachi jo,VALOR3=O THEN vlr:=Y; nue-izq:=tablaChi jo, 1ZQ3; nue-der:=tablalhi jo,DER3; IF (apunta-hoja(nue-irq) )fiND(apunta-hoja (nue BEG IN
Reduce solamente si 105 hijos son hojas 2. cambi a_estado(nue-icq,NEG-BOL) ; cambi a-estado (nue-der , NEG-BOL) ; hijo:=nueva-rama(nue_Izq,nue_der,vlr); combina-oper-bol :=True;
END; END;
BEGIN i nv: =Fa1 se; CASE tablachi ja,VALORl OF
C-MENOR, MEN-IG,C-IGUfiL,C-DIFER:
C-MENOR: BEGIN inv:=True; vlr:=MEN-IG; END;
C- I GUAL : vl r : =C-DI FER; C-DXFER: vlr:=C-IGUAL;
vlr : =C-MENOR; inv:=True; END;
MEN-IG: BEGIN
END; IF Not inv THEN BEGIN
nue-izq:=tablaChi jo, IZQ3; nue-der : =tab 1 at h i io, DER 3 ;
END ELSE BEGIN
nue-i z q : =t ab1 a C h i jo, DER3 ; nue-der:=tablaChijo, IZQJ;
END; h i jo:=nueva-rama(nue-izq,nue-der L v l r ) ; combina-oper-bol :=True; END;
ELSE END 3 END3
1 - der)) THEN
Funci6n que regresa una nueva rama si puede combinar el operador > 11 - I1 con los operadores"+" 6 I I $ II
FUNCTION combina_oper(VhR hijo:INTEGER):BOOLEAN; VAR nue,irq,nue-der,nue-hijo,vlr :INTEGER:
BEG IN combi na-oper : =Fai se: nue-i z q: =tab1 a L hi jo, I ZQJ 3 nue-der I: =t ab1 at hi jo, DER3 ; IF (tablachi jo,UALORJ IN OP-MULT) THEN BEGfN
Programa Reductor
Busca una hoja en el hijo izquierdo ó en el derecho 3 IF apunta-hoja(nue-izq) THEN BEGIN
cambi a-estado (nue-i t q , NEG-AR I T 1 ; tabl at nu@-i zq, CONTI : =t ab1 afnue-i z q , CONTI41 ; combina-oper: =True; hi jo:=nueva-rama(nue-izq,nue_der,tablaLhi jo,VALOR3);
END ELSE
IF apunta-hoja(nue-der) THEN BEGIN cambia-estadotnue-der,NEG-ARST); tabl atnue-der , CONT 3 : =t ab1 a t nue-der , CONT 3 + 1 ; combina-oper:=True; hi jo:=nueva-rama(nue-izq,nue-der, tablachi jo,VAL083) ;
END; END; IF tablaChijo,VALORl IN OP-CUM THEN
Reduce solamente 51 105 hijos son hojas, 3. cambia-estado(nue-izq,N€G-fiRIT); cambia_estado(nue_der INEG-ARIT) ; hi jo: =nueva-rama (nue-i zq, nue-der , tabl aChi jo, VALOR3 1 j combina-oper:=True;
I F (apunta-hojatnue_izq))fi~D(apunt~-hoj~(nue-der)) THEN BEGIN
END; END ;
Función que busca l a representacidn d e un nodo interno en la tabla y regresa l a direcci6n 6 O, el valor de verdad, y combina operadores 3 FUNCTION bus-i n t erno (padre, h-i z q : INTEGER ;
VAR h-der , ap-ret: INTEGER) :BOOLEAN; VAR i ,vlr, tip : INTEGER;
: BOOLEAN; ter mi na, unar i o BEG IN unario: =Fa1 sei IF h_izq=O THEN unario:=True; ap-ret : =O; termina:=False; v i r : =t ab1 a C padre, VCSLORI ; tip: =tab1 atpadre, TIPO];
I F vlr = NO THEN BEGIN Reduce el No Loqico 3
IF tablaCh~der,TIP03~>fNTERNO THEN BEGíPJ termina: =True; cambia,estado(h-der ,NEG-BOL) ;
END ELSE termina:=combina-oper-bol (h-der) ;
Reduce este nodo de 2 +ormas: combinando el operando d dejandolo en el hijo derecho si es hoja >
END5
IF (vlr = RESTfi)AND(h-izq(>h_der) THEN BEGIN vl r : =SUMA: termina:=True; Waior BOOLEAN0 que indica si hay cambio de oper3 I F tablath-der,tipol<>INTERNO THEN BEGIN
termina:=True; cambia-estado(h-der,NEG-fiRIT);
END ELSE termina:=combina-oper (h-der) ;
END; IF t ermi na THEN t ab1 at padre, VALOR3 : =vl r ; termina: =False;
I__^ Pag. 35 J.A.E.M.
.-“v_upy jl4-
”^ -.
Programa Reductor
ap-ret: ih-der; IF Not Unario THEN
IF ap-ret>O THEN bus-interno:=True ELSE bus-i nterno: =Fa1 se; END;
ap-ret: =recorre-tab1 a-secuenci al (h-i z q , h-der , vl r , ti p) ;
ERLAY FUNCTION reduce (VAR buff -expr :cad-expres) : INTEGER; R i:INTEGER;
rocedimiento que reduce una expresdn guardada en un DAG y uego llama l a ru t ina para obtener l a expresión3 ROCEDURE red-expresian (VAR ap: INTEGER) ;
rocedimiento que cambia el h i j o d e un nodo y borra a l h i j o viejo) PROCEDURE cambi a-hi jo (VAR apt: INTEGER; h-vi e jo , ap-nuevo: INTEGER) ; VAR ap-h-der, ap-h-izq, ñp-ret : INTEGER; BEGIN I F h-viejo=DER THEN BEGIN
ap-h-i zq: =tab1 aCapt IZQ3 j ap-h-der : =ap_nwvo;
END ELSE BEGIN
ap-h-der: =tabi at apt, DERI; ap-h-i zq : =ap-nuevo;
END; tab 1 at ap-nuevo, CONT 3 : =t abi at ap-nuevo, CONT 3+ 1 ; borr a-rama (tab 1 a C apt, h-vi e jo 1 1 ; IF bus-intsrno(apt,ap-h_izq,ñp_h_der,ap-h-der,ap-ret) THEN BEGIN
busca-cambi a-tab1 a (apt, ap-ret , tab1 at apt , CONTI, tab1 a) ; borra-rama(apt); apt: =ap-ret;
tab I a C ap-nuevo, CONT 3 : =t ab1 a t ap-nuevo, CONT 3 - 1 ; END ELSE tablaCapt,h-viejo3:=ap_nuevo; END;
-ocedimiento que remplaza un nodo hijo par o t r o 3 PROCEDURE rempl aza-nodo (padre, h-vi ejo, vl r , t i p , est : INTEGER) ; VAR ap-viejo,nuevo :INTEGER;
BEG IN ap-viejoo=tabl atpadre, h-viejo3; nuevo: -busca-hoja ( v l r , t i p , est 1 ; teblaCpadre,h_viejo3:=nuevo; tablaCnuevo,CONT3:=tablaCnuevo,CONTl+l; borra-rama (ap-vie jo) ; END]
-0cedimiento que el imina un nodo d e l DAG, y, l o remplaza uno de 5us h i j o s 3 PROCEDURE elimina-nodotVAR apt81NTEGER;h-queda:INTEGER); VAR borra,cuenta : INTEGER;
BEGIN IF h-queda=IiQ THEN borra:=DER ELSE borrar =I ZQ; borra-rama (t ab1 ai apt, borra 3 ) ; cuenta: =t ab1 at apt, CONT 3 ; busca_cambia_tabla(apt,tablatapt,h_queda3,c~enta,tab~a); cuenta: =t ab1 at apt , h-queda 3 ;
Programa Reductor
limpia-tupla(apt); apt: =cuenta; END;
rocedimiento que cambia los va lores de un nodo, ara esto crea uno nuevo y elimina el v i e j o 3
PROCEDURE cambia-nodo(VAR apt:JNTEGEñ;vlr ,t ip,est: íNTEGER)i VAR nuevo :INTEGER;
BEG I N nuevo:=busca-hoja(vlr, t i p , e s t ) ; t ab1 ñ C nuevo, CONT 3 : =t ab1 aC nueva, CONTI+ 1 ; busca-cambi a-t ab1 a (apt, nuevoy t ab1 a[ apt CONT3 t ab1 a) j borra-rama(apt); apt: =nuevo; END;
rocedimiento que borra un nodo h i j o 3 PROCEDURE borra-nodo(padre,hijo:INT€G€R); VAR ap-dux :INTEGER; BEGIN ap-aux:=tablaCpadre, h i j o l ; tablaCpadre,hi jol:=O; borra-rama (ap-aux 1 ; END;
FUNCT I ON VAR h-izq, h-der :INTEGER;
BEG IN hi jo-opuesto: =Fa1 se; h-i tq: =tab1 aCap, IZQI ; h-der : =tab1 aCap, DER]; I F (apunta-hoja(h-izq) )&ND
t i i j o-opuest o ( ap : I NTEGEH 1 : BOOLEAN;
(apunta-hoja (h-der) 1 THEN IF ( tab 1 a C h-i z 9, ESTADO 3 < >tab 1 ai h-der , ESTADO 3 1 AND
(tab1 ash-i zq y TIPOl=tabl aC h-der , ti po l 1 THEN IF compara (t ab-str C t ab1 a i h-i t q , VALOR3 3,
tab-str Ctablafh-der, VFILORJ 3 1 THEN hi jo-opuesto:=True;
END 3
FUNCTION pregunta(apt ,dir ,num,cla~e: INTEGER) :BOOLEAN; VAR hijo :INTEGER; BEG I N preguntar =Fa1 se; h i jor =t ab1 aC apt , di r 3 ; IF h i jo< >O THEN IF ~tablaChiJoytipo3=cla~e~AN~~tab~aChiJoyV~LOR3=num~
END; THEN pregunta:=True;
Fuci6n que recorre una rama comparando y buscando nodos del mismo t ipo (NUMERO) con l a o t ra r a m a del padre y regresa un va lor BOOLEAN03
FUNCTION recorre(apt,h_op,sig:INTEGEH):BOOLEA" VAR arbol , f i jo, di f er , ap-di f : INTEGER;
v-bol # BOOLEAN; BEGIN arbol : =t ab1 ai apt, h-op 3 ; v-bol : =Fa1 se; IF h-op-IZQ THEN fijo:=tablaCapt,DERJ ELSE f i jo: =t ab1 a i apt, IZQ 3 3
Pag. 37 J . A . E . M . I_ ~ , - - -1* ̂1 1 1 l-LIuI-i
Programa Reductor
di fer : =O; IF tablatarbol, IZQ2=fijo THEN difer:=DER; IF tablaCarbol,DER3=fi jo THEN difer:=IZQ; SF diferO0 THEN BEGIN ap-di f : =tab1 at arb01 , di fer 3 ; IF (tablaCap_dif,TSPOJ=NUMERO) THEN BEGIN
IF (tablatarbol ,VALORl=CUMAl THEN BEGIN IF ( (si g=POCI 1 AND (tab3 aC ap-di f , VALOR3 >O) ) OR
( (sig=NEG-ARIT)AND(tablaCap-ciif ,VALORJ(O) )THEN v-bolo-True; END ELSE
IF difer=DER THEN I F ( ( si g=POSI 1 AND (t ab1 a E ap-di f , VALOH3< O) 1 OR
( (si g-NEG-ARI TI AND (t ab1 at ap-di f , VALOR 3 >O) 1 THEN v-bol : =True; END;
END j recorre: =v-bol; END;
:unci6n que regresa un valor EOLEANO que determina si los 2 ri jos de un ap dado esto solamente ocurre cuando un hijo del ap ?5 hijo del otro hijo del ap y este e5 un operador aritmeticci 3 FUNCTION di f er (apt: INTEGER) :BOOLEAN;
'uncion que regresa un valor BOOLEAN0 si se da l a condición intes nombrada para un nodo fijo dado 3 FUNCTION camino-difer (fijo,arbol: INTEGER) :BOOLEAN;
VAR otro: INTEGER; BEGIN camino-difer:=false; otro: =O; IF tablacarbol , IZRI=f ijo THEN otro:=DER; IF tablatarbol ,DERJ=fi jo THEN otro:=IZQ: IF (otro<>O)AND(tablaCarbol ,VALOR3 IN OP-ARIT)
AND(tablaCarbo1 , TIPOl=INTERNO) THEN S F ~ t a b l a t o t r o , V A L O R 3 ~ > O ~ A N D ~ t a b l a E ~ t r o , T S ~ O l = N U M E R O ~ THEN
camino-difer:=True; END;
BEGIN {DIFERENTE Procedimento de diferente 3 d i f er : =Fa1 se; IF {cami no-di fer ( tab1 at apt, I ZQI , t ab1 at apt, DER 3 1 1 OR
(cami no-di fer ( t ab1 aC apt, DER], t ab1 at apt, I ZQJ 1 1 THEN di fer : =True; IF hi jo-opuesto(apt) THEN difer:=True; END;
inción que devueve un valor de verdad si si el h i j o izquierdo e5 mismo que el derecho) FUNCTlON igual(apt:INTEGER):BOOiEAN;
BEG IN i gual : =Fa1 se; I F (tab 1 aC apt , TIPO I= INTERNO) AND (t ab1 a E ap t , I20 3 =t ab1 a C apt , DER3 1
END; THEN i gual =TRUE;
FUNCTION mayor(apt:INTEGER):BOOLEANg VAR difer,hijo :INTEGER;
BEGIN mayor: =Fa1 se; hi jor=tablatapt, IZQ3;
Programa Reductor
I F (tablaChijo,TIP03=INTERNO~ AND(tablathij~~VALOR3 IN OP-SUM) THEN
IF (recorre(apt, IZí2,POSI) )THEN mayor:=True; hi jo: =t ab1 a C apt , DER 3 ; IF (tabl athi jci , TIPOl=INT€RNO)
AND (tabl aLhi joy VhLORI IN CRESTA, SUMfi3 1 THEN IF (recorre (apt, DER, NEG-ARI TI 1 THEN mayor: =True;
END;
FUNCTION menor(apt:lNTEGER):BOOLEAN; VCSR difer,hijo :INTEGER; BEGIN menor : =Fa1 se; hi jo:=tablafapt, I Z R I ; IF (tablachi joYTIP03=INTERNO)
AND(tnb1afhi jo,VALOR3 IN CRESTA,SUMAI) THEN IF ( recorre ( apt , I ZP , NEG-FIR IT 1 1 THEN menor : =True;
hi jo: =tab 1 a E apt , DER 3 ; IF (tablachi jo,TIPO3=INTERNO)
fiND(tabíathijo,VALORl IN LRESTfi,SUMAl) THEN IF (recorre(apt,DER,POSI) ITHEN menor:=True;
END;
OVERLAY PROCEDURE reduce-ytVflH apt:INTEGER); BEGIN IF (pregunta (apt , DER, FALSO, BOLEANA) 1 OR
(pregunta(apt,IZQ,FALSO,BOLEANA))THEN cambia-nodo(apt,FALSO,EOLEANA,PQSI) ;
IF pregunta(apt,IZP,VERDAD,BOLEANA) THEN elimina-nodo(apt,DER); IF pregunta(apt,DER,VERDAD,BOLEANA) THEN elimina-nodo(apt, I Z Q ) ; IF tablaCapt,DERI=tablaCapt~IX!3 THEN elimina-nodo(apt,IZQ); IF hijo-opuesto(apt) THEN cambia-nodo(apt,FALSO,BOLEANA,POSI); END;
OVERLAY PROCEDURE reduce-o(VAR apt:XNTEGER); BEGIN IF (pregunta(apt,DER,VERDAD,BOLEANA) 1
OR(pregunta(apt, IZQ,VERDAD,BOLECSNA) 1 THEN cambia-nodo(apt,VERDADyBOLEANAsPOSI);
S F pregunta (apt, I ZQ , FALSO, BOLEANA) THEN el i mi na-nodo (apt, DER) ; IF pregunta (apt , DERs FALSO, BOLEANA) THEN el i mi na-nodo (apt, I ZQ) ; IF tablatapt,DER3=tablaLapt,IZQl THEN elimina-nodo(apt,DER); IF hi jo-opuesto(apt) THEN cambia-nodo(apt,VERDAD,BOLEflNA,POSI);
END; *
OVERLAY PROCEDURE reduce-menor(VAR apt:INTEGER); BEG 1 N IF msnorlapt) THEN cambia-nado(apt,VERDfiDsBOLEANAyPOSI); IF mayor(apt1 THEN cambia-nodotapt,FALSOsBOLEANA,FOSI); IF igual (apt) THEN cambia-nodo(apt,FALCO,BOLEANA,POSI) ; END 3
OVERLAY PROCEDURE reduce-men-ig(VAR apt:INTEGER); BEGIN IF menor(apt) THEN cambia-nodo(apt,VERDAD,BOLEANA,POSS); IF igual(apt1 THEN cambia-nodotapt,VERDAD,BOLEANA,POSI); IF mayor (apt 1 THEN cambi a-nodo (apt , FALSO, BOLEANA, POS1 1 ; END;
Programa Reductor
OVERLAY PROCEDURE reduce-igual(VAR apt:INTEGER); BEGIN IF igual (apt) THEN cambia-nodo(apt,VERDAD,BüLE&Nfi,FOSI); IF difertapt) THEN cambia-nodo(apt,FALSO,BOLEfiNA,PCiSI); IF mayor(apt1 THEN cambia-nodo(apt,FÁLSO,BOLEAN&,POSI); IF menor(apt1 THEN cambia-nodo(apt,FACSO,BOLEANA,POCI); END;
OVERLAY PROCEDURE reduce-difer(VAR apt:lNTEGER); BEG IN IF di f er (apt 1 THEN cambi a-nodo (apt VERDAD, BOLEANA, POS3 1 ; IF mayor(apt1 THEN cambia-nodo(apt,VERDAD,I3CJLEANA,POSI); IF menor (apt) THEN cambia-nodo(apt,VERDfiD,BOLEAN¿4,POSl) ; IF igual(apt1 THEN cambia-nodo(apt,FALSO,BCiLEANA,POSI); END;
3-ocedimiento que asocia 105 operadore por medio de conjutos wden ados 3 3RLAY PROCEDURE asociñtivo(VAR papa:ZNTEGER); $te procedimiento asocia utilizando conjuntos 3 1R conj-a,conj-b,conj-c :tipo-conjunto; resultado, elemento, est, oper, auxi 1 i ar, ap-h-izq, ap-13-der : INTEGER; termina, guard : BOOLEAN;
'unción que regresa el siguiente elemento de un conjunto ordenado 3. 'UNCTION siguiente-elemento(u1t: INTEGER; VAR conj:tipo-conjunto): INTEGER;
BEGIN REPEAT u1 t : =Succ (u1 t 1 ; UNTIL (u1 t IN con j 1 OR (u1 t >v-grande) ; siguiente-eiemento:=ul t; END;
'UNCTION restaura-ramatVar conj:tipo-conjunto;op: INTEGER) E INTEGER; JAR apunt,element : INTEGER;
BEGIN eiement:=siguiente-elemento(O,con j) ; con j : =con j -C el ement 3 ; apunt: =element; WHSLE conjOC3 DO BEGIN
eiement:=siguiente-elemento(element,ccm j) ; con j : =con j-Eel ement 3 ; apunt:=nueva-rama(apunt,element,op) ;
END ; IF apunt<=v-qrande THEN restaura-rama:=apunt ELSE restaura-rama: =O; END;
WNCT ION rest a w a-dag (VAR con j-i z q , con j -der : t i po-can junt o;
lAR op,ap-der, ap-izq,apt : INTEGER; oper: INTEGER) : INTEGER;
BEGIN ap-itq: =O; ap-der : =O; op:=oper; IF oper-rDIVI THEN op:=MULTg IF con j -i zq< >C 3 THEN ap-i t q : =restaura-rama (con j-i r q , op 1 ; IF (conj-derOC3) THEN BEGIN
ap-dkr:=restaura_rama(conj-der,op);
._..-"-
Programa Reductor
IF (ap-irq = O)AND(oper = D I V I ) THEN
restaura_dag:=nueva_rama (ap-izq,ap-der,oper) a p ~ i z q ~ = b ~ ~ ~ c ñ ~ h o j a ~ l , N U M E R ~ , P O C I ) ;
END ELSE restaura-dag: =ap-izq; END;
FUNCTION asocia-identif(elemento,aper:INTEGER;VAR conj-b:
VAR est :INTEGER; tipo-conjunto) : BOOLECSN;
BEG IN asocia-identif :=Fal5e; est : =t ab1 aiel emento, ESTADO]; IF oper=SUMA THEN BEGIN
IF tablaielemento,ESTCSDO3=POSI THEN est:=NEG-ARIT ELSE est : =f OS I ; pal ab-auxi : =Copy (t ab-str ttabl a i el emento, VALOR3 3, i I
elemento: =Bu~ca-nodo (ELEMENTO, IDENTI, est, 1 ) j END; IF (elemento IN ccnj_b)AND(aper,::>MULT) THEN BEGIN
Length (tab-str C tab1 aiel emento, VALOR3 3 1 1 ;
asoci a-i denti +: = T r u e ; conj~b:=conj~b-Celementol;
END; END;
BEGIN C: Empieza procedimiento asociativo 3. oper : =tab1 a C papa, VCSLOR 3 ; IF (tablaCpapa,VALORl)= DIVI THEN oper:=MULT; IF (tablaCpapa,VALORI)= RESTCS THEN oper:=SUMA; conj-ar=i 3; conj-bi=CI; 1 1 ena-conjunto (t ab1 af papa, 1293, oper , con j-a) ; 1 1 end-con junto (t ab1 at papa, DER], oper , con j-b 1 ; termina: =False5 elemento:=v-bajo-1; resul t ado: =O; IF oper = MULT THEN
resul t ado: = I ; oper : =t ab1 a t papa, VRLOR 3 ; element o: =si gui ente-el ement o (O, con j-a); con j -c : =E 3 ; WHILE conJ-a<>CI DO BEGIN
guard : =Tr uet aux i 1 i ar : =el emento; con j~ar=conj~a-Celementol; CASE tablaCelemento,TIP03 OF
NUMERO s BEGS N guard: =False$ IF oper IN CSUMA,RESTAl THEN
ELSE resultador=resultado~tablaCelement~,VALORl; END;
resul tado: “resu1 t ado+t ab1 a C el ement o, VALOR 3
IDENTI : guard t =Not asoci a-i dent i f (el ement o, oper , con j -b ) ; ELSE;
END; eiementorrauxiliar; IF guard THEN con~~c:=conj~c+CelementoI; el emen tor =si gui en t e-el ement o (el emen t o, con j -a) ;
END;
Programa Reductor
el emento: =si qui ente-el emento (O, con j -b ; WHILE elemento<=v-grande DO BEGIN
con j -b : =con j-b-i el ement o1 ; CASE oper OF
IF tablaCelemento,TIP01 = NUMERO THEN BEGIN
SUMf3: resul tado:=re~ultado+tablaSelemento,VALORl; MULT: resul tado: =resu1 t adoSt ab1 at el ement o, VALOR 3 ; RESTAt r esul t ado: =resu1 t ado-t ab1 a Le1 emento, VALOR 3 ; DIVI: conj~b:=conj~b+CelementoI;
END; END ELSE
IF oper IN CSUMA,MULTl THEN BEGIN con j -c : =con j -c + C el emento 3 ; con j-b:=con j-b- Cel emento3;
END; el emento: =si gui ent e-el emento (el emen to, con j-b 1 ;
END; .C ap-izq apunta siempre a la rama izquierda y cuando ya no hay
rama derecha se convierte in nuevo papa 3. ap-h-i z q : =rest aura-dag (con j-c , con j-b , oper ) IF ( (resultado(>O)AND(oper IN CSUMA,RESTAl) )OR
((resultado<>l)AND(oper IN CMULT,DIVIl) 1 THEN BEGIN ap-h-der:=busca-hoja(resul tado,NUMERO,POSI 1 j IF oper=DIVI THEN oper:=MULT; IF oper=RESTA THEN oper:=SUMA; IF ap_h-izq<>O THEN ñp_h_ixq:=nueva_rama(ap-h-iz~,ap-h-~er,oper) ELSE ap-h-izq:=ap_h-der;
END; IF (ap_h_izq=C))AND(oper IN CSUMA,RESTAJ) THEN
ap-h-izq:=busca-hoja(O,NUMERa,POSI) ; IF (ap-h-irq=O)AND(oper IN SMULT,DIVII) THEN
ap-h-izq: =busca-ho ja ( 1 , NUMER0,POSI ; busca-cambia-tabla (papa,ap-h-izq, tablaCpapa,CRNTl,tabla) ; < para no perder algun elemento de intersección no se papat map-h-itq; END;
borra l a la rama 5in reducir 3
OVERLAY PROCEDURE reduce-div(VAR apttINTEGER); BEG IN IF pregunta (apt, DER, O, NUMERO) THEN
ELSE BEGIN error (14)
IF tablacapt, IZQJ=tablaLapt,DER3 THEN
IF pregunta(apt, IZQ,O,NUMERO) THEN
IF pregunta(apt,DER, 1,NUMERO) THEN elimina-nodotapt, IZQ); IF hijo-opuesto(apt) THEN cambia-nodo(apt,-l,NUMERO,POSi);
camb i a-nodo ( apt, 1, NUMERO , POSI 1 ;
cambi a-nodo (apt , O, NUMERO, POS1 1 3
END; END 3
OVERLAY PROCEDURE reduce-resta(Ví4R aptglNTEGER); BEí3 IN IF pregunta(apt,DER,O,NUHERO) THEN el imina-nodo(apt, IZQ) ; IF pregunta(apt,IfQ,0,NUHERO) THEN borra-nodo(apt,DER); IF tab1 at apt , I ZQ3=t ab1 ai apt, DER 3 THEN
cambia-nodo(apt,O,NüMERO,POSI); END;
Programa Reductor
OVERLAY PROCEDURE reduce-mult(VAR apt:INTEGER); BEGIN IF preguntatapt, IZQ,O,NUMERO) THEN elimina-nodo(apt, IZQ) ; IF pregunta ( apt , DER , O , NUMERO 1 THEN el i mi na-nodo < apt, DER) ; IF pregunta(apt,IZQ, 1,NUMERO) THEN elimina-nodo(apt,DER); IF pregunta(apt,DER, ¡,NUMERO) THEN elimina-nodo(apt, IZQ); END j
OVERLAY PROCEDURE reduce-suma(VAR apt:INTEGER); BEGIN IF pregunta (apt , IZQ, 0,NUMERO) THEN el imina-nodo (apt , DER) ; IF pregunta (APT, DER, O, NUMERO) THEN el i m i na-nodo (apt, I ZQ 1 $ IF hi jo-opuesto(apt) THEN cambia-nodo(apt,O,NUMERO,POCI); END;
OVERLAY PROCEOUHE reduce-numero(VAR ap:INTEGER); VAR apun-der,apun-izq,val-der,val-izq,result : INTEGER;
reduce : BOOLEAN; BEGiN reduce: =FALSE; apun-der : =t ab1 aC ap , DER3 ; apun-i zq: =t ab1 at ap, I ZQ3 ; val -i z q : =t ab1 at apun-i zq , VCSLORI ; val-der: =tablatapun-der,VALORI; ri-sul t : =O; IF tablaCapun-der,TIP03=tablaCapun_izq,TIPOl THEN BEGIN
reduce: =True; CASE tñblaCapun~der,TlP03 OF
NUMERO: CASE tab 1 a C ap , VALOR 3 OF SUMA: result:=val-izq+val-der;
RESTA: resul t : =val -i zq-val -der; MULT: resul t : =val -i zqtval -der ; DIVI: IF val-dert>O THEN
result:= Trunctval_izq/val_der) ELSE BEGIN
error (14) ; reduce: =Fa1 se;
END;
ELSE result:=FBLSO;
ELSE resul t:=FALSO;
ELSE resul t : =FALSO;
ELSE result : =FALSO;
C-MCIYOR: IF val -i zq>val -der THEN result : =VERDAD
C-MENOR: IF val -izq<val -der THEN result : =VERDAD
C-IGUAL: IF val-izq-val-der THEN result:=VERDAD
C-DIFER: IF val -i zq< >vai ,der THEN resul t : =VERDAD
ELSE reduce: =Fa1 se; END;
BOLEANCI: CASE tablaCap,VALORI OF O: IF (val -i zq=VERDAD) OR (val -der=VERDAD) THEN
result : =VERI)CID ELSE resul t : =FALSO;
Y: IF (val-izq=VERDAD)AND(val_deriVERDAD) THEN result : =VERDAD
ELSE result : =FALSO; ELSE reduce: =Fa1 eeg
END; ELSE reduce: =Fa1 se;
- -
Programa Redue t or
END; IF (tablaCñp,UALORl IN OP-ARIT1AND reduce THEN
I F (tablaCap,VALORl IN OP-REL+CY,Ol)AND reduce THEN cambia-nodo(ap,result,NUMERO,fOSI);
cambia-nodo(ap,RESULT3BOLE&N&,FOSI); END;
END;
PROCEDURE reduce-basica(VAR apt:INTEGER); BEGIN reduceinumero (apt) ; IF tablaCapt,TIPOl=INTERNO THEN CASE tablaCapt,V&LORl OF
SUMA8 reduce-suma(apt); RECTCI: reduce-resta (apt 1 ; MULT: reduce-mu1 t (apt 1 ; DIVI: reduce-div(apt1;
Y: reduce-Y(apt); O: reduce-0 (apt 1 ;
MEN-IG: reduce-men-ig (apt) j C-DIFER: reduce-difer ( apt ) ; C-MENOR: reduce-menor(apt); C-IGUAL: reduce-igual(apt);
ELSE END;
END;
FUNCTION reduce-dag(ap-tab1a:INTEGER):INTEGER; V M h i j o : INTEGER; BEGIN IF (tab1aCap~tabla,TIPOI=INTERNO) THEN
IF (Not errlAND(tablafap~tab1a,TIPOl=INTERNO) THEN BEGIN reduce-basica tap-tabla) ;
IF (Not tapunta-hoja(tablaCap-tabla, I tQI) )OR Not (apunt a-ho ja tab1 aiap-tab1 a, DER3 1 1 AND (tablaCap-ta&la,VALORl IN OF-QRIT) THEN
asoci at i vo tap-t ab1 a) ; IF tablaCap-tabla, IZQI >O THEN
hi jo:=reduce-daq(tablafap-tabla, I Z Q I ) ; IF t ab1 at ap-t ab1 a, DER3 >O THEN
hi jo:=reduce-dag (tab1 aCap-tabla,DERl) ; IF (Not (apunt a-ho ja (t ab1 aCap-tab1 a, I ZQI 1 1 OR Not (apunt a-hoja (t ab1 at ap-t ab1 a, DER3 1 1 1 AND (tablaCap_tabla,VALOR3 IN OP-ARIT) THEN
reduce-basica(ap-tabla) 8 asoc i at i vo ( ap-t ab 1 a 1 ;
END; reduce-dags =ap-tabl a; END8
BEGíN {reduce expresidn 3 err: =Fa1 sei apr=reduce-dag (ap) ; buff -2srChr ( 0 ) ; rec-ant er i or tap, buff -2, t ab1 a) ; END;
FUNCTION expresion: INTEGER; VAR apl,ap2,ap3,ap-act,ap-control : INTEGER;
invert : BOOLEAN;
Programa Reductor
FUNCTION expr -ari tmet i ea (desi C: BOOLEAN) : INTEGER; procedimiento que copia un DAG en l a matriz d e DilG especia les 3
FUNCTION copia-daqtapt:INTEGER):INTEGERr VAR d i f e r , i ,ap-sec,ap-ini,ini-esp,ult,ini:INTEGER; BEG 1 N ap-sec: =ap-prim; ini-esp: =tope; ap-ini :=tope+i; difer:=ap-prim-ap-ini; WHILE ap-sec<=uitimo DO BEGIN
tope:=tope+i; FOR i:=i TO LON-L DO
IF t ab l aC ap-see , DER3 >O THEN IF tablalap-sec, IZ í23Tü THEN
I F ap-sec=apt THEN ap-ini :=tope: ap-ser:=ap-sec+l;
dag-espeC tope, i I : =tab1 a l ap-sec , i 3 ; daq-espeCtope,DERI:=tablaCap-~ec~DERl-difer;
dag-espeltope, IZQl:=tablaCap-sec, IZGJ-difer;
END; compacta-dag (ap-ini, tope,daq-espe, ini-esp) ; cop i a-dag: =ap-ini ; END;
PROCEDURE compl emento (expre: BOOLEAN) ; VAR ap,ult-aux,prim-aux,ap2: INTEGER; BEG I N u1 t -aux: =u1 ti mo; prim-dux :=ap-prim$ ap-pri mr =u1 t i mo+i ; n i vel : =n i vel + 1 ; IF expre THEN ap:=expresion ELSE ap; sexpr-ar i tmet i c a (Fa1 se) ; red-expresion (ap) ; ap2: =copi a-dag tap) ; t ab l a-espetul t-dag-espe, E-EXPR3: =ap2; n ive l :=nivel-1; u1 timo: =u1 t-aux ; ap-prim:=prim-dux; END;
3racedimienmtD que apunta a l a expresibn re lac iona l ; segmentada 3 PROCEDURE llena-datos-expr-rel(apt:INTEGER); VhR i ,ap : INTEGER; BEG I N FOR i:=IZQ TO DER DO BEGIN
apr =dag-espeCapt , i 3; tabla-espeiul t,dag_espe,4+i I:=dag,espeCap,VALOR3; t ab1 a-espelul t ,dag,espe, 1 +i 3 : =dag-espeC ap , i 3 :
END; apr=dag_e5peCapt,IZ93; tab1 a-ecrpec u1 t-dag-espe, E-EXP-C 3 : =dag-espe t ap , DER3 ; END;
PROCEDURE expr-re1 ,esp; VAR aux-prim,aux-ult,
ap l , ap2, ap3, apd, api , ap-exp : INTEGER; buff -re1 a t :cadena;
Paq. 45 J .A .E .M. ____u UII
Programa Reductor
BEGIN aux-ult:=ultimo; ñux ,pr i m: =ap-pr i m j ap-pr i m: =u1 ti ma; nivel :=nivel+l ; ap 1 : =expr-ar i tmet i ca (Fa1 se) ; nivel :=nivel-1;
ELSE EEGIN I F apl=O THEN arror (8 )
conv-lex (toquen); IF Not(toquen i N OP-REL) THEN e r ror (9 ) ELSE BEGIN
ap2: =ubica-oper (toquen) ; esta: =Fa1 se; nivel:-nive3+1; ap-ex p : =expr -ari tmeti cñ (Fa1 se) ; nive l : =nivel-i ; IF Not ( esta ) THEN error (10) ELSE BEGIN
IF bus_ intern~ (ap l , ap2 ,ap_exp ,ap i ) THEN
ELSE BEGIN 1 i mpi a-tup1 a (apL)
apunta (ap2, ap í a p - e x p ) ; api : =ap2;
END; conv-1 e x (toquen ; I F Notttoquen IN OP-REL) THEN er ror (9 ) ELSE BEGIN
ap 1 : =ubi ca-aper (toquen ) ; ni vel : =ni vel +1 j ap2:=expr_aritmetica(Fñise) ; nive l :=nivel-1; IF ap2<>Ci THEN BEGIN
I F (bus-i nterno (ap 1, ap-exp, ap2, apd 1 1 THEN
ELSE BEGIN 1 i mpi a-tup1 a (ap 1 1
apunta (ap 1 , ap-exp , ap2 1 ; apd: =ap 1 ;
END; ap3: =ubi ca-oper ( Y ) ; I F bus-i nterno (ap3, ap i , apd , ap 1 ) THEN
ELSE BEGIN 1 i mpi a-tup1 a ( ap3)
apunta(ap3,api ,apd) ; apl : =ñp3;
END; red-expresi on ( ap 1 ) ; ap3: =Copi a-dag (apl 1 ; 1 1 ena-dat os-expr -re1 (ap3) ;
END; END;
END; END;
END; u1 ti m a : =aux -u1 t ; ap-prim:=aux-prim) END;
PROCEDURE un i ver sal (str-uni :cad,corta;expre:BOOLEAN) 5
Programa Reductor
VAR b u f f -univ :cadena; REG IN ult-dag-espe: =u1 t-dag-espe+l; IF Compara (str-uni , ’ TODO’ 1 THEN BEGIN
b u f f -uni v: =Copy ( C h r (231 ) y 1,lI ; tabla-espeCult-dag-espe,E_TIP03:=231;
IF compara(str-uni, ’EXISTE’) THEN BEGIN
END ELSE
b u f f -uni v: =Copy (Chr (2C;8),1,11; tab1 a-ecipetul t-dag-espe, E-TIPOI: =238;
END ELSE BEGIN
b u f f -uni v: =Copy (Chr (228) , I y 1 ) ; tabla-espeCult-dag-espe,E-TIPO1:=228; END;
conv-1 ex (toquen 1 ; I F toquen< >PA-IZR THEN e r r o r (5) ELSE BEGIN
ccinv-1 e x (t aquen 1 j I F toquenc:>IDENTI THEN er ro r ( 6 ) ELSE BEGIN
palab-auxi:=Copy(palabra, l ,Length(paiabra) ) ; ap-control:=busca-hoja~tocquen,IDENTI,POSI); contrala:=Copy(paiabra, 1,Length (palabra) 1 ; tabla-especul t-dag-espe,E-CONTHl:=busca_str (cont ro la) ; conv-1 ex (toquen 1 ; IF toquen<:> DOS-PUNT THEN e r r o r ( 7 ) ELSE BEGIN
buff-univ:=Concat(buff-univ,’ ( ’ ,controla, ’ : ’ ) ;
expr-rel-esp; buff-univ:=Concat (bu f f -univ, buff-2, ’ : ’ 1 ; conv-lex (toquen) ; IF t o q u e n 0 DOS-PUNT THEN er ro r ( 7 ) ELSE BEGIN
comp 1 ement o ( e x p r e 1 ; b u f f -2: =Concat (buf f -uni v , b u f f -2, ’ 1 ’ 1 ; conv-1 ex (toquen) ; IF toquenOPA-DER THEN e r r o r ( l 1 ) ;
END; END;
END; END; END;
FUNCTION variab1e:INTEGER; VAR ap,res-var,prirn-aux,ult-aux,i :INTEGER5
b u f f -expre :cadena; erpeci a l
BEGIN : BOOLEAN;
buff -expre: =Chr (0) 8 p r i m-dux : =ap,pr i m) u1 t-aux : =u1 ti mo; especial : =Fa1 se; res-var : =O; palab-auxi :=Copy(palabra, 1,Length (palabra) 1 g IF compara(palabra,’TODO’ )OR cornparatpalabra, “EXISTE’ITHEN BEGIN
universa l (palabra,True); b u f f -expre: ‘Copy (buf f -2,l ,Length (bu f f -2) ) ; especial D =True;
Pag. 47 J.A.E.M. _. * _ _ _I - --.^
..---.U--
-_- ”-
Programa Reductor
END ELSE BEGIN
canv-lex (toquen) ; CASE toquen OF DOS-PUNT: BEGIN
conv-lex (toquen) ; IF toquen=C-IGUAL THEN BEGIN
conv-lex (toquen) ; IF compara(palabra, ’SUM’ 1 THEN BEGIN
buff-expre:=Concat(palab-auxi,’ :=’I; universal (”C*,FfiLSE); especial :=True; bu+f -expre: =Concat (buff -expre, buf f - 2 ) ;
END ELSE error (3) ; ,
END ELSE error (18) j END;
ap-pr i m: =u1 ti mo; buff -expre: =Concat (pal ab-dux i , ’ C ’ 1 ; ap : =ex pr-ñr i tmet i ca (Fa1 =.e 1 ; red-expresion (ap) ; buff -expre: =Concat (buff -expre, buf f -2 , ’ 3’ 1 ; conv-1 e x (toquen 1 ; IF t oquent XORCH-DER THEN error ( 4 1 ; END;
1 ee: =Fa1 se; buff-expre:=Copy(palab-auxi, l,Length(palab-auxi 1); END ;
CORCH-IZQ: BEGIN
ELSE BEGlN
END; €termina caso 3 END; u1 timo: =u1 t-aux ; ap-pr i m: =pr i m-aux ; pal ab-aux i : =Copy (buff -expre, 1, Length (buff -ex pre) 1 ; res-vñr:=busca-hoja(toquenyXDENTI,POSI); IF especial THEN begin
tabla-espetul t_dag_espe,E-AP_STRJ: =tablñCres-var ,VALOR3; tablafres~var,DIR~ESP€Cl:=ult~dag~espe;
END; var i ab1 e: =res-var; END;
I INTEGER; I INTEGER;
FUNCT ION f a c t -si mpl e VC\R ap l , resu l t , num-equi
BEGIN apl:=O; conv-1 ex 4 toquen 1 ; CASE toquen OF
NUMERO: BEGIN Val (pal abrac num-equi resul t 1 ; apl:=busca-hoja (num-equi ,NUMERO,POSI) ; END;
IF compara(controla,palabraI THEN esta:=True; palab-auxi :=Copy(palabra, l ,Length(palabra) I ; apl:=busca-ho ja (toquen, IDENTI ,POSI 1 ; END;
IDENTI I BEGIN
BOLEANfi I BEG I N
Pag. 48 J.A.E.M.-_ -___ Y-.-
Programa Reductor
IF compara (pal abra, ’ VERDAD’ THEN ap 1 : =bust a-h o j a (VERDQD , BOLEANA, POS I 1
ELSE a p l : = b u s c a ~ h o j a ~ F ~ L S O , ~ O L E ~ N ~ , F O S í ~ ; END;
ap 1 : =ex p r -ar i t m e t i c a Fa1 se) ; conv-lex (toquen) ; IF toquen.: >.PA-DEH THEN error (1 1 ) ; END;
FIN: error(l7);
PA-IZQ: BEGIN
ELSE e r r c r (16) ; END; f ac t -s i m p l e: =ap 1 ; END; ,
FUNCTION .factor: INTEGER; VAR ap1,num-equi,result :INTEGER;
BEGIN apl:=O; ronv-lex (toquen); CASE toquen OF
NUMERO: BEGIN V a l (pal abra, num-equi , resul t ) ; apl: =busca-ho j a (num-equi ,NUMERO, POS1 1 j END;
K D E N T I : ap 1 : =var i ab1 e ;
IF compara (pal abra, ’ VERDAD’ 1 THEN apl:=busca-hoja(VERDAD,i3OLEfiNA9P0SI)
ELSE a p l : = b u s c a ~ h o j a ~ F A L S ~ , ~ O L E ~ N A , P O S I ~ ; END;
ap 1 : lexp res i on; conv-1 ex (toquen ) ; IF toquen<>PA-DER THEN e r r o r ( l 1 ) ; END;
FIN: e r r o r (17) ; ELSE error (15) ;
BOLEANA: BEGIN
PA-IZQ: BEGIN
NO: apl:=fattor;
END; factor: =ap 1 ; END;
FUNCTION t e r m i no (r el ac : BOOLEAN) : INTEGER; VCIR ap 1 , ap2, ap3, ap-act : INTEGER;
BEGIN SF relac THEN api:=factor ELSE ap 1 : =f act-si m p l e; IF ap1OO THEN BEGIN
conv-lex (toquen); WHILE (toquen I N op-mult)OR(relac AND(toquen = Y ) ) DO BEGIN
apZ:=ubica-oper(toquen); ap3: =factor; IF ap30O THEN
I F bus-interno(ap2, apl , ap3, ap-act ) THEN
ELSE BEGIN l impia- tup la(ap2)
apunta(ap2,aplYap3); ap_act:=ap2;
END
Programa Reductor
ELSE BEGIN l impia-tupla(ap2); ap-act:=O; errar (2) ;
END; I F ap-act<>Ci THEN conv-lex (toquen); apl:=ap-act;
END; 1 ee: =Fa1 se; ap-act: =apl;
END ELSE ap-act: =O; termino:=ap-act; END:
FUNCTION simplg(relac:BOOLEAN) ; INTEGER; VCIR apO,ap1,ap2,apJ9ap-act: INTEGER;
BEGIN conv-1 e x (toquen ) ; apO: =O; I F (toquen IN OP-SUM)OR(relac AND(toquen=NO) 1 THEN BEGIN
I F toquen=RESTA THEN apO:=ubica-oper (toquen) ; I F r e l a c AND(toquen=NO) THEN apO:=ubica-oper (toquen) :
END ELSE 1 ee: =Fa1 se; apl : =termi no (re1 ac) ; I F apl(>O THEN BEGIN
conv-1 e x (toquen 1 ; WHILE (toquen IN OP-SUM)OR(RELAC fiND(toquen=O) ) DO BEGIN
ap2 : =ubi c a-oper ( toquen 1 ; ap3: =ter m i no (re1 ac 1 ; IF ap3.C >.O THEN BEGIN
I F bus_interno(ap2,apl,ap3,ap_act) THEN
ELSE BEGIN limpia-tupla(ap2)
apunta (ap2, apl ap3) ; ap-act: =ap2;
END; END ELSE BEGIN
limpia-tupla(ap2) j ap-act: =O; error ( 1 ) ;
END; IF ap-act<>O THEN cow-lex (toquen) ; apl:=ap-act; END; 1 ee: =Fa1 se: ap-act : =ap 1 ;
END ELSE ap-act : =O; IF ñpO< >O THEN IF- bus-i nterno (apO, O, ap-act , ap 1 1 THEN ap-act : =ap 1 ELSE BEGIN
tab 1 aC apü, DER3 3 =ap-ac t ; ap-act : =apO;
END; si mpl et =apex t ; END;
Pag. 50 J.A.E.M. l-l.
IC-
Programa Weduc t or
xpresicln aritemetica "desic" indica si e5 expresidn aritmetica o relaciona13 BEG IN expr-ari tmeti ca: =si mpl e (desi c 1 ; END;
BEGIN {empieza expresion 3 ap 1 : =expr-ari tmet i ca (True) ; IF apl<X) THEN BEGIN
conv-1 e x (toquen 1 ; IF toquen IN OP-REL THEN BEGIN
i nver t : =True: CASE toquen OF
C-MAYOR :toquen:=C MENUR: MAY-IG :toquen: =MEN i L j d ELSE invert : =Fa1 SG;
END; ap2:=ubi ca-oper (Tsquen) ; ap3: = e x w -ari t ,mtica ( true) ; IF ap3< 30 7'115N BEGIN
I F i r1bw- t THEN BEGIN at acttsap3; up3: =apl; apl : =ap-act;
5JD; i F bus_interno(ap2,apl,ap3,ap_act) THEN
ELSE BEGIN limpia-tupla(ap2)
apunta(ap2,apl,ap3); ap-act : =ap2;
END; END ELSE BEGIN
1 i mpi a-tup1 a ( ap2) ; ap-act :=O; error ( 0 ) ;
END; END ELSE BEGIN
1 ee: =Fa1 se; ap-act : =ap 1 ;
END; END ELSE ap-act:=O; ex pr @si on : =ap-act ; END;
PROCEDURE i n i c i a-vl r ; VAR posic ion, i ; INTEGER;
termina : EOOLEAN; BEGIN Cposicidn en l a t a b l a 9 controla:=Chr (0) ; err: =Fa1 se; 1 i bre: =O; € guarda en un archivo memoria l a expresbn con renqlones de 80 3 renglon:=O; arch-mem: =True; ap-der: =O; ap-izq:=C); longitud:=Oj
Programa Reductor
posi cion: =l ; leeP=True; f i n a l : =Fa1 se! i :=O; nivel:=O; € Nivel de profundidad de i a recursividad con l a5 especiales3 termi na: =Fa1 se; WHILE Not termina DO BEGIN
i := i+ l ; arch-expr Ci 3: =Copy (buff -expr , posicion, 80) ; posicim:=posicion+80; IF posicion>Length (buff-expr) THEN termina:=True;
END; ult-ren-exp:=i;
END; r i : = l to ult-ren-exp do writeln(arch-exprCi3);
rocedure que r e c i b e una expresidn "BUF-EXPRE" y l a regrsa reducida 3 BEGIN C Empieza el procedimiento reductor > i n i c i a-vlr; ap-tabla:=expresian; Genera un D. A. G. y regresa el apuntador 3 t ab1 a l ap-t ab1 a , CONTI : =t ab1 at ap-t ab1 a, CONTI +l;
FOR i :=ap-pri m TO u1 timo DO I F t a b l a t i ,CONTl=O THEN
borra-rama(i 1 ; I F Not err THEN BEGIN
red-expresion (ap-tabla); reduce: =ap-tabl a; buff-expr:=Copy(buff-2, l,Length(buf+-2) 1;
END ELSE BEGIN
GotoXY (2,s) ; x:=WhereX; yyr=WhereY; FOR i := l TO ult-ren-exp DO
W r i te (arch-expr t i 3 1 ; GotoXY (x+y-err-l, yy+ren-err-l) ; Read (kbd, caracter 1 ; Window ( 2 , 22, 78,251 ; C1 rScr ; Delete (huf f -expr , 1 ,Length (buff -expr) 1 ;
END i END f
Pag. 52 J.A.E.M. ~ _ - - . . - _ _ __- _._.PI--_-.-"
Programa DEMUESTRA
nnct i on !gin id ;
si gui ente-el emento ( i : integer ; con jun : ti po-con junt o) : i nt eger ;
ID; ,ocedure llena_conjunto(ap_O,Y: 1nteger;anteced: tipo-con junto) ; 'gin id; .ocedur-e escribe-conjunto (cxmg:tipc-con junto) ; !gin id;
'unción que busca una "SUBCADENA" en un STRING, desde una posición n i c i a i , regresa l a posicibn i n i c i a l , 5 un numero mayor a l a longuitud el STRING 3 INCT 1 ON busca-sub cadena ( st r-c ad subcad : cad-ex pres; pos : INTEGER 1 : INTEGER ; cR encuentra :BOOLEAN;
BEG i N encuentra: =Fa1 5e; WHILE (pos+Length (subcad) -f(=Length (str-cad) 1 AND (NOT encuentra) 13U BEGIN
i n i - p a l ,ap-sub : INTEGER;
ap-sub:=l; ini-pal :=pos$ IF ~tr~cadCpos3=subcad~ap_sub3 THEN BEGIN
encuentra: =True; WHILE(encuentra)AND(ap-wb.<Length (subcad) 1 DO BEGIN
ap-sub: =ap-sub+l;
IF subcadCap-subI~< >str-cadCposI THEN encuentra: =Fa1 se; POS:=pOS+l;
END; END; pos:=ini-pal+l;
END; I F encuentra THEN busca-subcadena:=ini -pal ELSE busca-subcadena:=Length (str-cad) +l; END;
Procedimiento
OCEDURE se1 ecci ma-c on j un t o ( apun t : INTEGER; VAR con j un : t i po-c on junto;
BEGIN IF (tab 1 a C apun t , T IPOI = I NTERNO 1 AND (tab 1 a I: apun t , VALOR 3 =Y 1 THEN BEG IN Llamado recurs ivo y hace un recorr ido medio 3
se1 ecc i ona-con junto (t ab1 at apunt , I ZQ3, con jun , ap-O) ; selecciona~conjunto~tablatapunt,DER3,conjun,ap~O~;
IF (t ab1 a I: apun t , TIP03 =INTERNO) AND (t ab1 af apunt , VALOR3=O) THEN ap-O: =apunt
ELSE conjun:=c~njun+Capuntl;
que l l e n a un conjunto y apunta a una hoja que 5ea una disyunci 6n >
VAR ap-O:INTEGER);
END ELSE
END;
Función que reduce directamente l a implicación Dor l a t a b l a d e VERDAD 3 NCTION reduce-direc (apl, ap2: 1NTEGER;VAR re su l ti'lNTEGER1 !BOOLEAN; BEGIN
I -- I -I-
Pag. 53 J.A.E.M. .I --I ---
Programa DEMUESTRA
resul t : =l ; reduce-direc:=False; IF ( t ab1 a C ap-dag 1, TIPO 3 =EOLEANA) AND It ab1 a t ap-dag 1, YALOR 3=FALSD) THEN
IF (t abi a C ap-dag2, TIPOJ=BOLEANA) AND (t ab1 aCap-dag2, VALORJ=VERDAD) THEN
I F (t ab1 a E. ap-d ag2 , TIPO I=BOLEANA) AND ( tab 1 aC ap-dag2 , VALOR 3=FALSD) AND (t ab1 aC ap-dag 1, T IPO3 =BOLEAN&) AND (t ab1 a C ap-dag 1, VALOR J=VERDAD) THEN BEGIN
red uce-d i r ec : =True;
r educe-d i r ec : =True;
reeul t : =FALSO; reduce-direc: =True;
END; END;
INCTION sigui-elem-ord(VAR vect:tipo-vect-cmj;VAR j:INTEOER):INTEGER; BEGIN REPEAT
UNTIL (j=M&X-ELE-EQU) OR (vect C j I/, 3 0 ) ; IF j-<=MAX-ELE-EQU THEN sigui~elem_ard:=vecttjl ELSE si gui -el em-urd : =O;
j:=j+l;
END;
INCTION expre-conj-ord(op:INTEGER;VAR matriz:tipo_matr_cUnj)
if3 i , j,a,b : INTEGER; : cad-expres;
ant e, cons, expre-equ, e x pres: c ad-ex pr es; BEGIN delete (expre-equ, 1 , Length (expre-equ) 1 ; FOR i:=l TO MAX-CON-EQU DD BEGIN
j:=O; a: =si gui-el em-ard (matriz C i 3, j 1 ; I F a 0 0 THEN BEGIN Deletetante, i,Length(ante)); rec-anterior (a,ante,tabla) ; matrizfi , j3:=0; b: =sigui -elem-ord (matri 2: C i 3, j 1 ; WHILE j<MfiX-ELE-EQU DO BEGIN
Delete(cons, 1,Length (Cons) 1; rec-anterior (b,con5, tabla) ; matrizti, jI:=O; I F Length(expre-equ)>O THEN
ELSE expre-equ:=Concat (ante,Chr top) ,cons) ; ante:=cons; b: =si qui -el em-ord (matriz S i 3, j 1 ;
expre-equ:=Concat(expre-equ,’ * (‘,ante,Chr(op),cons,’)’)
END: END 5
END; ex pre-con j -ord: =ex pr e-equ; END;
NCTION expres-conj-equ:cad-expres; IR expr-equ,expr-men,ante,ccms:cad-expres;
i , a , b : INTEGER; BEG I N Delete (expr-equ, 1 ,Length (expr-equ) ) ; Deletetexpr-men, l,Length(expr-men) 1; ante: =chr ( 0 ) ; FOR i:=l TO MAX-CON-EQU DO BEGIN
a: =siguiente-elemento(0,con j-equi C Y 3 ) ;
Pag. 54 J.A.E.M. - - u _ I _ u c I I - 1 - ~ -
Programa DEMUESTRA
IF a<=v-grande THEN BEGIN Delete(ante, 1,Lengthíante) ) ; rec-anterior (a,ante,tabla); conj-equici J:=conj~equiCil-Cal; WHILE conj-equiCil~:~>C1DO BEGIN
b : =5i qui en te-el emento (a, con j-equi C i 3 ) ; conj~equiCil:=conj~equifi 3-tbl; cons:=char ( 0 ) ; rec-anterior (b,cons,tabla) ; IF Length (expr-equ) >.O THEN
ELSE expr-equ:=Concat (ante, ’=’ ,cons) ; a:=b; ante: =cons;
expr-equ: =Concat (expr-equ, ’ * ( ” ante, ’ =? ,cons,’)’)
END; END;
END; expr_men:=expre-conj-ord (C-MENOR, matr-men) ; IF Length (enpr-men) >O THEN
IF Length (expr-equ) >O THEN
ELSE expr-equ: =expr-rren; expr-equ:=Concat (expr-equ, ’ (’. ’ ,expr-men)
ex pr -men : =ex pre-con j -ord (MEN-I G, mat -m-i g 1 ; IF Length (expr-men) 30 THEN
I F Length (expr-equ) C.0 THEN
ELSE expr-equ: =expr-men; expr-equ:=Concat (expr-equ, ’ .*. ’ ,expr-men)
expres-con j-equ: = e x p r -equ; END;
rocedimienta que ubica en el centro de un conjunto los
OCEDURE nuevo(e1emento:INTEGER;VAR vector:tipo-vect-conj); elementos iniciales 3
BEG IN vectortMAX-ELE-EQU DIV 23:=tablaCelemento, I Z R J ; vectorC (MhX-ELE-EQU DIV 2)+1 J:=tablaCelemento,DERl; END;
Funcidn que busca un conjunto que este vacio 3. NCTION busca-libre(VAR matriz:tipo-matr-conj1:INTEGER; s libre :BOOLEAN;
i,j : INTEGER; BEGIN 1 ibre; =Fa1 se; i:=l; WHILE(N0T libre)AND(i<=MAX-CON_EQU) DO BEGIN
1 i bre : =Tr ue; j:=l; WHILE 1 i br e ) AND j S: =MAX-ELE-EQU) DO
IF (matriztiltjl00) THEN
ELSE j : =: j+l ; libre:=False
IF NOT libre THEN i:=i+l; END; busca-1 i bre: =i ; END;
:unción que regresa un apuntador a la posición de un elemento en un íjunto; si no esta regresa un valor mas grande del permitido 3 rlCTl0N busca-elem(e1ementorINTEGER;VQR vector:tipo-vect-conj):INTEGER;
Pag. 55 J.A.E.M. .--...- -”-- P
Programa DEMUESTRA
3 encuentra :BOOLEAN; j : INTEGER;
BEG IN encuentra: =Fa1 se;
WHILE (NOT encuentra) AND (j<=MAX-ELE-EQU) DO j . - m-1;
IF (vector[ jI=elemento) THEN encuentra:=True ELSE j:=j+l;
busca-elem:=j; END;
3-ocedimiento que incer ta a l i n i c i o de un conjunto 3. 3CEDURE incerta-ini (elemento: 1NTEGER;VAR vector : tipo-vect-con j ) ; 3 i %INTEGER; BEG IN i : = l ; I F vectorCiI=O THEN BEGIN
WHILE vectorCi+ll=O 00 i :=i+l; vector C i 3 : =el ement o;
END ELSE PEGIN
WHILE (i (MAX-ELE-EQU) AND (vector C i 3.:: :.O) DO i : =i + l ; IF i<=MAX-ELE-EQU THEN REGIN C Mueve el sector del vector a l a derecha 3
WHILE i > l DO BEGIN vector C i 3 : =vector C i -1 3 ; i.- .-i-l-
c END; vectorCi3:=elemento;
END ELSE Write(’ Estructura insu f ic iente ‘1;
END ; END;
-0cedimiento que incer ta a l f i n a l de un conjunto 3 ICEDURE incerta-fin(e1emento: 1NTEGER;VAR vector:tipo-vect-conj); ? i :INTEGER; BEG IN i:=MAX-ELE-EQU; IF vectorCi3=0 THEN BEGIN
WHILE (vector C i -1 ]=O) DO i : =i -1 ; vector t i 3 : =el ement o;
END ELSE BEGIN
WHILE ( i >I 1 AND (vector C i I< >O) DO i : =i -1 ; IF i>=l THEN BEGIN C mueve el sector del VECTOR a l a izquierda 3
WHILE i<MAX-ELE-EQU DO BEGIN vector C i 3 I =vector t i +13 3 i : =i +1;
END; vector CMAX-ELE-EQU3: =elemento;
END ELSE Write(’ Estructura insu f ic iente * 1;
END; END;
-uncibn que regresa (True) Cuando el elemento es el primero del conjunto, (False) en otro caso 3 JCTION u1 t’i mo-el e (el ement o: INTEGER; vector : ti po-vect -con j 1 : BOOLEAN;
Programa DEMUESTRA
dente, eliminando algunos casos particulares 2 PROCEDURE conjunto-especial; VCIR ap,i,dire :INTEGER;
5tr-lim, str-contr : cad-expres; REGIN di re: =t ab1 aC el. em, DSH-ESPECI ; IF t ab1 a-espet di re, E-EXP-D l=t ab1 a-espel. di re, E-EXP- I 3 THEN BEGIN conjun:=conjun-Celeml; IF (tab1 a-espeCdi re, E-OP-I 3 IN CC-iGUAL, MEN-IGI 1 AND
(tabla-espetdire,E-OP_D3 IN CC-IGUAL,MEN-IGI) THEN BEGIN con jun: =con jun+Celeml; ap:=tabla-espeCdire,€-f?iP-STRl; Del et e (str-1 i m, 1 , Length (str-1 i m) 1 ; rec-anterior (tabla-espeCdire,E-EXP-D3,str-lim,dag-espe) ; cambi a-especi al (t ab-str C t ab1 a-espeC di re, E-CDNTR3 3 , st r --l i m,
tab-str Cap 3 1 ; END; FOR i:=l TO ultimo DO
FOR i:=í TO LONG-ESPE DO tabla_espeCdire,i3:=0; IF tablaCi ,DIR-ESPECl=dire THEN tablaCi ,DIH_ESPEC3:=O;
END ELSE c u n j _ e s p : = c o n j _ e s p ~ C ~ l ~ m l ; END;
BEGIN €Empieza CoJ~intos EWIvalentes3 < Limpia los conjuntos de equivalencia para el CONJUNTO recibido
conj_esp:=Cl; =OR j:=i TO MAX-CON-EQU DD BEGIN
como parametro 3
conj-equiCjl:=Cl; C Conjuntos d e igualdad 3 FOR k : = í TO MAX-ELE-EQU DO BEGIN
matr-menC j , k 3 : =O; mat-m_igCJ,Kl:=O;
END; END; 21em:=siguiente_elemento(C),conJun) ; WHILE telem<=v-qrande) DO BEGIN
IF (tabla~elem,TIPO1=INTEH"EN BEGIN IF (tablatelem,VALORl = C-IGUhLl THEN conjunto-iguales; IF (tablaCelem,VALORI = MEN-IGITHEN conjunto-menorestmat-m-ig) ; IF ( tab 1 at el em, VALOR 1 = C-MENOR) THEN can j unt o-menor es ( matr -men 1
END; IF (tablafelern,DIR-ESPECl<>O) THEN con junto-especial ; el em I =si gui ent e-el ement o (el em, con jun 1 ;
END; ite('sa1e conj equivalentes ' ) ; ;ribe-conjunto(conj-esp); END;
=unción para determinar si 2 valores con iguales usando 3s Conjuntos de igualdad inicial VCTION transi ti va-i gu (el emt INTEGER) : BOOLEAN; 3 i 3 INTEGER; termina D BOOLEAN;
BEGIN
transitivo_igu:=False; rlHiLE (i<=Mf4X-CDN-EQU)AND(NOT termina) DO
i . - . -1;
IF (tablaCelem,IZQl IN conj-equiCi3)AND (tablatelem,DERl IN conj-equi til)
3
-.- Pag. 61 J.A.E.M. .--Y-__*
- , .
Programa DEMUESTRA
THEN BEGIN transi ti vo-i gu:=True; termina: =True;
END ELSE i:=i+l;
END ;
NCT ION transi ti vo-men < term-a, term-b i INTEGER; VAR matr i z : ti po-matr -con j :
R i,j : INTEGER; termina,esta_a,esta_b :BOOLEAN;
BEG IN
termi nat =Fa1 se; WHILE (i<=MAX-CON_EQU)AND(NOT termina) DO BEGIN
i qual : BOOLEAN) : BOOLEAN;
i:=i= 5
j:=l; esta-a: =Fa1 se; esta-b: =False; WHILE (j<=MAX-CON-EC¿U)AND(NOT termina) DO BEGIN
IF term-a=matrizCilCjl THEN BEGIN esta-a: =True; IF (NOT Igual )AND(esta-b) THEN esta-a:=False;
END; IF term-b=matriiCiJCjI THEN esta-&:=True; IF (esta-a) AND (esta-b) THEN termina:=True ELSE j:=j+l;
END; i : =i + 1 ;
END; transitivo-men:=termina; END;
NCT ION i qual -term (ter ml , ter m 2 , ti p : INTEGER ) : BOOLEAN; U igal : BOOLEAN;
apl , ap2 : INTEGER; BEGIN igal:=True; IF dag~espe~terml,TIP0Jodag_espett~rm2,TIPOJ THEN igal:=False; IF daq~espeCterml,EST~DOl<>dag~espeCterm2,ESTADOl THEN igal :=False; IF igal THEN
CASE dag-espetterml, TIP01 OF INTERNO: BEGIN
IF dag-espef t erml , WLOR 3 < >dag-espeC term2, VALOR 3 THEN i gal : =Fa1 se ELSE BEGIN
IF (dag-espetterml, IZR3(>0)AND(dag-espetterm2, IZQ3<>0) THEN
i gal : =Igual -term (dag-espet t erml , I ZRJ , dag-espefterm2, IZQI, tip)
ELSE IF(dag-espetterml, I Z Q l ~ ~ O ~ O R ~ d a g _ e ~ p e C t e r r n 2 , 1 2 ~ 3 0 ~ 0 ) THEN
i gal t =Fa1 eje;
END; IF NOT igal THEN
IF (dag_espeCterml,DER3<>0~AND~dag~e~pettefm2,DERJ~>~~ THEN
i g a l :=Igual_term(daq_espettermí, IZRJ, dag-espeCterm2,IZQI,tip)
ELSE IF (dag-espetterml, DER]< >O) OR (dag_espetterm2,DERI< >.O) THEN
Programa DEMUESTRA
igal : =Fa1 se; END;
BOLEANA: XF (dag-zspeCterm1 , VALOR].: ::.dag_caspeCt~srm2~ VALOR1 1 THEN i gal : =Fa1 se;
NUMERO: CASE t i p OF C-MENOR: IF (dag-espeEterm1 ,VALORI>dag_espeCterm2, VALOR])
C-MAYOR: IF (dag-espec t erm 1 , VALOH 1 < dag-espeC t er m2, VFILORI 1
C-IGUAL: IF (dag-espeCterm1 , VfiLORl< >dag_espeCterm2, VFILORI)
THEN i gal : =Fa1 se;
THEN i gal : =Fa1 se;
THEN i gal : =Fa1 se; END;
ap 1 : =dag-rspeC term1 , VCSLORI ; apíl: =dag-espeCterm2,VALORl; IF tab-strcapi J<Stab_strCap23 THEN
IDENTI: BEGIN
IF tJOT((ap1 IN conj-cantr)AND(ap2 IN conj-contr)) THEN i gal : =Fa1 se;
END j
END; i qual -term: =i gal ;
END;
NCTION recrxre-dag-ecpe~apt:INTEEEH):INTEGER; BEGIN IF dag_espeCapt,TIPOI=I"Q THEN
IF (dag-espeCapt, IZQl(>0)~ND(dag_espeCapt,DER3(>0) THEN recorre-dag-espe: =recorre-dag-espe (dag-espeCapt, IZQJ 1 +
recorre~dag~espe(dag~espefapt,DERl~+l ELSE BEGIN
IF dag-espeiapt, IZQl<>O THEN
IF dag-espeCapt, DER]< >O THEN recorre_dag_espe:=l+recorre-dag-~spe(d~g-~speCapt~ IZQI);
recorre-dag-espe: =i+recorre-dag-espe (dag-espefapt , DER1 1 ; END
ELSE recorre-dag-espe:=i; END;
NCT ION val or a (VAR con jun : ti po-con junt o; apunt : INTEGER) : INTEGER; R val ,scum, el em: INTEGER; BEGIN val -acum: =O; el em: =si gui ente-el emento (O, con jun ; WHILE elemt=E-EXPR DO BEGIN
val -acum: =val -acum+recorre-dag-espe (tabl a-especapunt , el em3 ; el em: =si gui ent e-el emento (el em, con jun ;
END; valoraiival-acum; END;
DCEDURE expr-especial (conj-opt: tipo-conjunto;optimo,apunt-b: INTEGER); R ante-espe,cons-espe :cad-expres; el em : INTEGER;
BEG IN el em: =si gui ente-el emento (O, con j-opt ) ; WHILE elem<=E-EXPR DO BEGIN
Deletelante-espe,l,Length(ante-espe)); Delete (cons-espe, 1 , Length (cons-espe) 1 ; rec-anteri or (tabl a-espetoptimo, eleml, ante-espe, dag-espe) ;
-- _I-
Pag. 63 J.A.E.M. --I- .. XI
Programa, DEMUECTHci
rec-anterior (tabla_espeCapunt_~,elem3,cons_espe,~ag~~spe~ ; IF Length (expr-espe) 3.C) THEN
expr-espe:=Concat (expr-espe, ’ .* ,ante-espe, ’ 1 => ( ’ , cons-espe,’)’)
ELSE expr-espe:=Concat ( ’ < ’ ,ante-espe, ’ => ’ ,cons-espe, ’ 1 ‘ Z ;
el em: =si qui ent e-el ement o (el em, con j-opt 1 ; END;
END; iteln(’especia expre :’,expr-espe);
3CEDURE implica-especial (elem: 1NTEGER;VAR cmsecu: tipo-conjunto) ; R esp-antec , apunt-a, apunt-b, val or, i , val -npt , cant i , opt i roo, ter m-opt : INTEGER; conj-opt, conj-term : tipo-conjunto; termina :BOOLEAN; FEGIN val_opt:=999; optirno:=ci; esp-antec : =si gui ente-el ement o ( 0 , con j-esp ) j apunt -b : =t ab1 ace1 em, DIR-ESPECJ ; term-apt : =999; termina:=FkLGE; WHILE (NOT termina; AND(eep-antec(=V_grande) DO BEGIN
conj-term:=[]; apunt -a : =tab 1 at esp-an t ec , DIR-ECPECI ; conj_contr:=Ctabla~espeCapunt~~,E~CONTR3,tabla~espeCapunt~b,E~CONTRl~; IF t a b l ñ ~ e s p e C a p u n t ~ a , E ~ T I P O l = t a b l a ~ e s p e C a p ~ ~ n t ~ b , E ~ T I P O l THEN BEGIN
IF NOT (igual-term(tabla_ospetapunt_a,E_EXP_I3, tabla-especapunt-b, E-EXP-I 1,CJENOR) 1 THEN
con j-term:=con j-term+CE-EXP-I 3; IF NOT(igual-term(tabla-espeCapunt_a,E_EXP_Dl,
tabla-espeCapunt-b,E-EXP-DJ,C-MAYOR)) THEN conj~term:=conj~term+CE~EXP~Dl;
IF NOT (igual -term (t ab1 a-espec apunt-a, E-EXP-CI , con j-t er rn: =con j -t er m+C E-EXP-C 3 ;
IF t ab1 a-espec apunt ,a, E-T IPO3=228 THEN
ELSE I F (tabla-espeCapunt-a,E-OP-Il<>MEN-IG) THEN
tabla-espeCapunt-b,E-EXP-Cl,C-IGUAL) 1 THEN
IF tabla~espeCapunt~a,E~OP~Il<>tabla~espeCapunt~b,E~OP~Il THEN
conj~term:=conj~term+tE~EXP~C,E~EXP~Il
con j-term: =con j-term+CE-EXP-C, E-EXP-I I ; IF tabla~espeCapunt~a,E~OP~~~~~tabla~e~peCapunt~b,E~OP~Dl THEN
IF tabla_espeCapunt_a,€-TIPC33=228 THEN
ELSE IF (tabla-espeCapunt-b,E-OP-Dl<>M€N-IG) THEN con j-t er m: =con j-term+I E-EXP-C, E-EXP- I 3 ;
tabla-espeCapunt-b,E_EXPR3,C_IGUAL)) THEN
con j -ter m: =con j -t erm+ f E-EXP-C, E-EXP- I 3
I F NOT (igual -term (tab1 a-espetapunt-a, E-EXPRI , con j-ter m: =con j-t erm+ CE-EXPR 3 ;
canti :=O; FOR i:=l TO E-EXPR DO
IF i IN conj-term THEN canti:=canti+l; IF (canti < term-opt 1 AND (cant i <=4) THEN BEGIN
valor:=valora(conj-term,apunt-b) ; IF valorXval-opt THEN BEGIN
conj-opt: =con j-term; optimo:=apunt-a; val-opt: =val or ;
Programa DEMUESTRA
iR pos :INTEGER; BEGIN pos:=busca~elem(elemento,vector) ; ultimo-ele:=True; WHILE pos<MAX-ELE-EQU DO BEGIN
pos: =pos+l; IF vector Cpos3.; 30 THEN BEGIN
u1 ti mo-el e: =Fa1 se; pos: =MAX-ELE-ERU;
END; END; END;
Función que regresa (True) si el elemento del conjunto es el Stimo, (False ) en ot ro caco 3 INCTION primero~elemento:3NTE~ER;vect~r:tipo~vec~~c~nj~:BO~LE~N; IR pos :INTEGER; BEG IN pos:=l; primero:=false; WHILE pos<MAX-ELE-EQU DO
I F vector iposl.:: 33 THEN BEGIN IF vectorCposl=elemento THEN primero:=True; pos: =MAX-ELE-EQU;
END ELSE pos:=pos+l;
END;
unción que busca in elementci en los conjuntos de igualdades 2 NCTION busca-con j-orden (el emento: INTEGER; VAR nuevo: BOOLEAN) : INTEGER; R i,ap-nvo : INTEGER; BEG I N i := l ; ap-nvo:=ó;< apunta a l primer conjunto vacio que encuentre 3 nuevo: =True; WHILE (i<=MAX-CON-ERU)ANDtnuevo) DO
IF elemento IN conj-equiCi3 THEN nuevo:=False ELSE BEGIN
IF (con j-equi C i 3=t 3) AND (ap-nvo=O) THEN ap-nvo: =i ; i :=i+l;
IF nuevo THEN BEGIN END;
busca-conj-orden:=ap-nvo; I F ap-nvo=C, THEN Write( 'Error estructura de conjuntos insuf '1;
END ELSE busca-conj-orden:=i; END 3
Funcidn que regresa el siguiente canjunto que t i ene un elemento, busca apar t i r de un conjunto dado 1 NCTION sgte-cjto(elemen: 1NTEGER;VAR matriz: tipo-matr-conj;
R termina: BOOLEAN; i , j : INTEGER;
VCSR nuevo:BOOLEAN; conj-ini:INTEGER):INTEGER;
BEGIN termina:=False; i :=conj- ini ; WHILE (NOT t er mi na) AND ( i <MAX-CON-EQU) DO BEG1 N
j : =O; i o - .-i+l;
Pag. 57 J.A.E.M. -
Programa DEMUESTRA
WHILE(N0T termina)AND( j+:MAX-ELE-EBU) DO BEGIN j:=j+li IF (matriz I: i I L: j ]=el emen THEN termi na: =True;
END; END; Nuevo: =NOT ter mi na 8 IF termina THEN sgte-cjto:=i ELSE sgte-cjto:=busca-libre(matri=)$ END ;
:Procedimiento que une dos CONJUNTOS representados en la matriz 3 WXEDURE une(VAR matriz:t ipo-matr_conj;ap-vec-l ,ap-vec-~~INTEGER); V4R i: INTEGER;
BEGIN FOR i:=l TO MAX-ELE-EQU DO BEGIN
IF matrizCap-vec-2,ilOO THEN BEGIN incerta-f in (matri L I: ap-vec-21 C i 3, matriz Cap-~iec-131 j
matrizCap-vec-2lCi ]:=O; END;
END; END;
:OCEDURE escribe-matriz (VAR mat:tip~_matr_i~nj); \R i, j:integer; BEGIN FOR i:=l TO max-con-equ DO BEGIN
FOR j:=l TO max-ele-equ 00
Writeln; Write(matCi, j3:3);
END ; Read(hbd,caracter) ;
ID;
‘rocedimiento donde se obtienen los con juntos d e equinalencia )ara menores, menores igueles e igules 3 ,OCEDURE c jtos-equi (VAR conjun: tipo-con junto) ; rR elem,ap-conj-l,ap-conj-2~posl,pos2, j,k : INTEGER;
nvo-1 ,nvo,2, encuent : BOOLEAN3 € Procedimiento que llena el conjunto de iguales, no
PROCEDURE conjunto-iguales; BEGIN con jun:=con jun-Celeml; ap~conJ~lr=busca~conj_orden (tablacelem, IZQ3,nvo-1) ; ap-con j-2~r =busca-canj -orden (t ab1 a C el em, DER], nvo-2) 8 IF (nvo-2) THEN BEGIN
importa el oreden 3
IF (nvo-1) THEN conj-equi tap~conj~llr=ttablaCelem, IZRII; conj~equiCap_conj_l3:=conj~equi Cap~conj~l3+Ctablafelem,DERIl;
END ELSE BEGIN
IF nvo-1 THEN
ELSE con j-equi C ap-con j-23 : =con j-equi C ap-con j-2 3+C t ab1 a C el em, I ZQ3 3
IF ap-conj-l<>ap-conj-2 THEN BEGIN conj-equi Cap-conj-l3:= conj-equiCap-conj-ll+conj-equi Cap-conj-23: conj~equifap~conj~23:=il;
END; END;
END;
Programa DEMUESTRA
Procedimiento que l l e n a l o 5 conjunto5 de menares 6 menures igua les dependiendo de la matr iz que se como parametro 3 PROCEDURE conjunto-rnenores(VAR matr iz E t ipo-matr-ron j ) ; VAR ap : INTEGER;
BEGIN con jun:=c~njun-CelemI; ap-con j- 1 : =sgte-c j t o (t ab1 ate1 em, I ZQI , matr i z , nvo- 1,O) j
ap-con i -2: =sgte-c j t o ( t a b l ate1 em, DER], matr i z , nvo-2, O ) ; I F (nvo-2) THEN BEGIN
uni o , i n i c i o, t e r m i na: BOOLEAN;
I F (nvo-1 1 THEN nuevo (el em, mat r i 2 Cap-con j -1 I ) ELSE BEGIN
REPEAT €So10 5e puede guardar cuando e5 u l t i m o elemento 3 encuent: =u1 t i mo-el e ( t a b l a t e l em, IZQI , n a t r i z C ap-con j-11) ; I F NOT encuent THEN ap-con j - 1 : =sgte-cj t o (t ab1 atel em, 1293, matr i z , nvo- 1 ap-con j -1 ;
UNTIL tencuent)0R(nvo-l) ; I F encuent THEN
ELSE nuevo(rlem,matrizCap_cbnj_13); i nce r ta - f i n ( t a b l atel em, DER], mat r i z Cap-con j - 1 3 )
END; END ELSE BEGIN
REPEAT I F (nva-1) THEN BEGIN
encuent : =pr i mero (t ab1 a5 e1 em, DER], mat r i z I: ap-con j-2 1 ; I F NOT encuent THEN a p ~ c o n j ~ 2 : = s q t e ~ ~ j t o ~ t ~ b l ~ C e l e m ~ D E ~ 3 , m a t r i z , n v o ~ ~ , ap-con j-2) j
UNTIL (enccient 1 OR (nvo-2) ; I F encuent THEN
i ncer t a - i n i (t ab1 a C e l em, I ZRI , matr i z 1. ap-con j -2 1 1 ELSE nuevo (el em, matr i z C ap-can j -23 ;
END ELSE BEGIN
unio:=False; < I n d i c a s i 5e unieron 105 conjuntos 3 Apunta a l conjunto donde e l h i j o I Z O es el primero 6 el h i j o DER 1s e l u l t i m o 3
ap:=O; termina:=False; inicio:=True; € i n d i c a 5 i se i n c e r t a a l i n i c i o 3 WHILE (NOT nvo-1) AND (NOT termina) DO BEGIN
ap-con j-2: Esgte-c j t o (tab1 aC e l em, DER], mat r i z , nvo-2, O j WHILE (NOT nvo_2)AND(NOT termina) DO BEGIN
pos1 : =busca-el em (t ab1 at e l em, I ZQI , m a t r i z t ap-con j- 1 1 1 ; pos2: =busca-el em ( t a b l a t e l em, DER3 , matr i t tap-con j -23 1 ; I F ap-conj-1.: >ap-conj-2 THEN BEGIN
I F pr i mero (t ab1 a t e l em, DER], mat r i z Cap-con j -23 1 THEN
I F u1 t i mo-el e (t ab1 a t e l em, I ZQI , matri z C ap-con j- 1 3 THEN BEGIN
ap: =ap,con j-2;
ap:=ñp,con j-1; inicio:=Falseg
END; I F (posl<MfiX-ELE-EQU) AND (pos2<MAX_ELE_EQU) THEN
I F matrizCap~conj~l+l3Cposl+ll= matrizCap~con~~23fpos2+13 THEN
matrizCap~conj~lltposl+ll:=O; I F (pos1 >.l) AND (pos2< 1 ) THEN
I F matrizCap~conj~13Cposl-l1= matr i z C ap-con j 3 3 Cpos2-13 THEN
Programa DEMUESTRA
matrizCap~conJ~23Cpos2-il:=O;
une (matriz ap-con j-i ap-cm j-1) ; uni o: =True;
I F u1 ti mo-el E? t ab1 at el em, I ZQI , matr i z C ap-con j- 1 3 AND pri mero (tab1 a Cel em, DER 3, matr i z f ap-cm j -2 I 1 THEN BEGIN
END; END ELSE BEGIN
IF posl>p0~2 THEN BEGIN con junto-i qual es; matriz f ap-con j- 1, pos1 3 : =O; matr i z C ap-con j-2, pos23 : =O;
END; termina:=True; unio: =True;
END; ap-conj_2:=sgte_cjto(tablaCelem,DER3,
END;
END; I F NOT unio THEN
I F ap-O THEN nuevo(elem,matrizLap_cUnj_231 ELSE
IF i n i c i o THEN i ncerta-i ni (tabl alelcm, I293 , matri z Cap3 ELSE i ncerta-.f i n ( tab l atel em, DER], matr i z C a p 3 1 j
END; END; END ;
Procedimento que camabia el STRING de UR especial por su reducción 3 PROCEDURE cambia-especial (str-contr,str-lim:cad-exprtzs;UAR
VAR i : INTEGER; caracter :CHAR;
str-espe:cadena) ;
BEG 1 N i :=1 ; REPEAT
car ac ter : =st r ,@spec 1 3 ; IF caracter=’:’ THEN i:=i+l; Delete(str-espe, l * l ) ;
UNTIL i>S;
REPEAT i.- . -1;
i:=busca~subcadena(str~espe,~tr~contr,i); I F i<=Length (str-espe) THEN REGIN
Delete(str-espe,i,Length(str)); Snsert (str-1 i m , str-espe, i 1 ; ir=i+l+Length(str-lim);
END 5 UNTlL i >Length (str-espe) ; REPEAT
car ac ter : =str -espe CLengt h (st r -espe 1 3 ; Delete(str-espe,Lenqth (str-espe) , 1 ) ;
UNTIL caracter”’ 1 ’ ; END;
Procedimiento para crear el conjunto de especiales del antece
- <- .--_-."- .-.. _I_. .--?=?- . . . . . . . . . . . . . . . . ........... . ._-_, ..................... ._.- ...... ....
Programa DEMUESTRCI
WHILE(N0T termina)CIND( j<MfiX-ELE-EQU) DO BEGIN j:=j+l; IF(matrizCi1C jl=elemen) THEN termina:=True;
END; 1; wo: =NOT termina; termina THEN sgte-c jto:=i
;E sgte-c jto: =busca-l ibre (matriz 1 ; 1; \
:edimiento que une dos CONJUNTOS representados en l a m a t r i z 3 ZDURE une(VAR matriz:tipo_mñtr_conj;ap_vec_l,ap_vec_2:INTEGER)~ J. INTEGER; 3EG 5 N :OR i:=i TO MAX-ELE-EQU DO BEGIN
IF matrirCap_vec_2,il(SO THEN BEGIN incerta-f in (matriz Cap-vec-23Ci 3, matrix rap-vec-131 ; matr i z C ap-vec-23 C i 3 : =O;
END; 1ND; IND ;
IURE escr i be-matr i z (VAR mat: tipo-matr-coni ; , j : i n t eger ; ;IN i i:=l TO max-con-equ DO BEGIN -OR j:=i TO max-ele-equ DO Wr i te ( m a t C i , j 3 : 3) ;
J r i teln; z
1; -- -,- - -- 3d(kbd,caracter);
?dimiento donde se obtienen los conjuntos de equinalencia
IURE cjtos-equitVAR conjun:tipo-conjunto); lem,ap~conj~l,ap~conj~2,posl,pO52,j,k :INTEGER; #o-1, nvo-2, encuent : BOOLEAN: 'rocedimiento que llena el conjunto de iguales, no imparta el oreden 3 3CEDURE conjunto-iguales;
menores, menores igueles e igules 3
BEGIN con j un : =con j un- C el em 3 ; ap_conj_lr=busca_conj~orden(tablaCelem~ iZQ3,nvo-1); ap~conj~2:=busca~conj~orden~tablaC~lem,DERl,nvo~2~: W (nvo-2) THEN BEGIN -
I F (nvo-1) THEN conj-equi Cap-conj,lli=CtablaCelem, IZQ33g con j-equi Cap-con j,i3:=cwr j-equi Cap-con j-lI+ttablaCelem,DER33;
END ELSE BEGIN
IF nvo-1 THEN -
ELSE conj-equi Cap-conj-23i=con j-equi Cap-conj-23+CtablaCelem, IZPII
IF ap-conJ-lC>ap-conj-2 THEN BEGIN
END;
conj-equiCap-conj-l3:= conj-equi Cap~conj~lI+conj~equiCap~conj~21~ con j-equi Cap-conj-23:=CJ; -
END; END;
Programa DEMUESTRA
2 , eliminando algunos casos particulares 3 :DURE con junto-especi al ; ap,i,dire :INTEGER; str-1 i m, str - c a n t r : cad-ex pres; 3IN -e:=tablaLelem,DIR-ESPECl~
ionjun:=conjun-Celeml; IF ( t ab1 a-tispeC di re, E-OP- I I IN CC-I GUAL, MEN-I O1 1 AND
(tabla_espeCdirgyE_~P_D3 IN CC-iGUAL,MEN-IGI) THEN BEGIN
t a b l a ~ e s p e L d i r e y E _ E X P ~ D l = t a b l a ~ e ~ p e ~ ~ i r e , E ~ E X ~ ~ X l THEN BEGIN
c m jun : =con juntCelem3; ap:=tabla-espeCdire,€-~~-STRl~
rec-anterior ~tabla_espeCdire,E~EXP_D3,str_lim,dag_espe~ ; c ñmbi a-especi al (tab-str I: t ab1 a-espeC di re, E-CONTRI I y st r -1 i m,
- Delete(str-lim, l,Length(str-lim)); --
t ab-str Cap 3 1 ; IND ; -OR i:=l TO ultimo DO
'OR i:=l TO LONG-ECPE DO tabla-espeCdire,il:=O; 3 SE conj-esp:=cm j-esp+Celeml; 2;
IF tablaCi ,DIH-ESPECl=dire THEN tablati ,DIH-ESPECl:=O;
4 (Empieza CclJuntos ERUIvalentes3 npiñ los conjuntos de equivalencia para el CONJUNTO recibido no parametro 3 -esp : =C 3 ;
~j-equiCjI:=Cl; C Conjuntos de igualdad 3 3 k:=l'TO'l%T%-ELE-EQU DO BEGIN
j : = i TO MAX-CON-EQU DO BEGIN - - --
matr-men C j , k 3 : =O; mat-m-i g C J, K I : =O;
);
: =si qui ente-el emento (O, con jun 1 ; E (elem<=v-qrande) DO BEGIN
I F (tab1 atelem,VfiLORl = C-IGUAL) THEN conjunto-iguales: I F (tablaCelem,VALORl = MEN-1G)THEN conjunto-menores(mat-m-ig); I F (tablaCelem,V~LORl = C-MENOR)THEN conjunto-menores(matr-men); 3 ;
em: =si qui ente-el emento (el em, con jun 1 ;
(tablaCelem,TIP03=INTERNO)THEN BEGIN
(tab 1 a C el em, DI R-ESPECI.: >O 1 THEN con jun t o-espec i al ;
'-le con j equivalentes ' 1 I 2 - conjunto(conj-esp);
-.
idn para determinar si 2 valores son Iguales usando mjuntos de igualdad inicial 3N transitivo-igu~elemr INTEGER) :BOOLEAN;
: INTEGER; +-mina f BOOLEAN; v i ei t i vo-i gu: =Fa1 se; E (i<=MfiX-CON-EQU)AND(NOT termina) DO I F (tablaCelem,IZPl IN conj-equiti 3)AND
-
(tablaiel~,DERI IN conj-equiCi 3 ) a - # "I I <I
Pax. 41 J.A.E.M.: _ _ _ ~" -.. li- 11_------ - I _-,_ y.1_ - I - ~. I _ _
Programa DEMUESTRA
IF END;
‘D SE IF D;
URE 2:
r-aux : cad-expres; GIN lete (expr , l ,Length(expr ) ) ; con junto< >.t 3 THEN BEGIN el em: =si gui en t e-el emen t o (O, con junto) ; str-aux:=Chr ( 0 ) ; rec-anterior (elem,str-aux, t ab l a ) ; expr:=str-dux; e1 em: -si gui en te-el emen to (el em, can j un t D 1 ; WHILE elem<=v-grande DO BEGIN
str-aux:=Chr 10) j rec-anterior (elem,str-aux, tab la ) j expr: =Concat (expr, * ’ 5 t r - a ~ ~ ) j
el em: =si qui ent e-el ement o (el em conjunto) ; -!END; IF c-equival THEN BEGIN
str-aux : =expres-con j-equ; Length(5tr-dux) ::.O THEN expr:=Cmcat texpr, .% .’ ,str-au:<.) j
r-equi v a l THEN expr: =expr-~?~-can j-squ;
pre-con j (UAR ante, conse: tipo-con junto den-ante, caden-con : cad-expres; G 11.1 den-ante:=Chr ( 0 ) ; den-con: =Chr ( 0 ) ; r-con j (ante,caden-ante, True) ; -
VFsñ express
- r-conj (conse,caden-con,False) ; - -- press: ic-Bfi it ( ’ ( ’ ,caden-ante, ’ 1 => ( ’ ,caden-con, ’ 1 ’ 1 ;
Length (expr-espe) >O THEN express: =Concat ( ’ ( ’ , express, ’ 1 * ( ’ , expr -espe, ’ ) ’ ) ; D;
ON combina(VAR a,b,ayb: INTEGER) :BOOLEAN; GIN mbi na: =Fa1 se; b:=O; (a=O) OR (b=O) THEN combina :=True; (a=l) AND (b=l) THEN BEGIN combina:=True; ayb:=l;
D i D;
icn que reduce los conjun tos de equivalencia, do l a información se r e p i t e en los di ferentes untos, y regresa (TRUE, r e s u l t = Fa150.) si hay radicción 3 ON elimina-conjun(VAR conjunt:tipo-conjunfo;
N i na-con jun : =Fa1 sei
-
VAR resu l t : INTEGER) ;BOOLEAN;
cad-ex pr es)
ión que reduce los conjuntos de l consecuentes si son ucidos por los conjuntos del antecedente, regresa TRUE 1 consecuente se redujo en forma to ta l 3 ON reduce-conjunto (VAR ap-dag1 , ap-dag28 INTEGER3