Programación Lógica

25
 Programación Lógica Los lenguajes de la 4° generación son imperativos (reciben órdenes), ejemplos: Pascal, C. Los lenguajes de la 5° generación son uncionales o declarativos, ejemplos: Lisp, Prolog. Prolog es una abreviatura de !Programming in Logic!. "n #$%& Colmovaur lo escribió en 'ortran en una muina *+. Posteriormente en "dimburgo se escribió en código de muina en una P-P. >Valioso(oro). alioso es un predicad o, /ro es el elemento (constantes en min0sculas). >Valioso. "ste predicado no tiene elementos, tiene aridad  1. >Valioso(plata). >Valioso(bronce). !La plata es valioso!, !el bronce es valioso!. 2o dos estos predicados se escriben en un !programa! de Prolog. 2ras !correr! el programa, se pueden 3acer estas consultas: ?- Valioso(oro). ¿Es valioso el oro? Esta es una meta Yes Si, es la respuesta ?- Valioso(X. ). X es una variable, por ello va en mayúscu la Xoro! Esta es una respuesta. "l a#re#ar el punto y coma se le Xplata! est$ pi%ien%o otra respuesta &ue satis'ace la meta Xbronce! no uan%o ya no encuentra m$s respuestas respon%e con no. Programa "n el programa se ponen marcas acerca de los predicados ue a 3an servido de respuesta. l resatisacer la meta, las marcas se acumulan. l solicitar una meta nueva las marcas se !olvidan!. este mecanismo se le conoce como algoritmo de 6obinson. "jemplos: >*e+#ust a(uan,maria). " uan le #usta ar/a >*e+#usta(pe%ro,carla). >*e #usta( or#e,maria). " estos pre%ica%os (%e ari%a% 0) tambi1n se les conoce como 2ec2os. ?- * e+#u sta(X,maria). eta3 ¿" &ui1n le #usta ar/a? Xuan! Xor#e! no

description

les dejo algo de prolog

Transcript of Programación Lógica

Programacin LgicaLos lenguajes de la 4 generacin son imperativos (reciben rdenes), ejemplos: Pascal, C. Los lenguajes de la 5 generacin son funcionales o declarativos, ejemplos: Lisp, Prolog. Prolog es una abreviatura de "Programming in Logic".En 1972 Colmovaur lo escribi en Fortran en una mquina IBM. Posteriormente en Edimburgo se escribi en cdigo de mquina en una PDP.>Valioso(oro).Valioso es unpredicado, Oro es elelemento(constantes en minsculas).>Valioso.Este predicado no tiene elementos, tienearidad0.>Valioso(plata).>Valioso(bronce)."La plata es valioso", "el bronce es valioso". Todos estos predicados se escriben en un "programa" de Prolog.Tras "correr" el programa, se pueden hacer estas consultas:?- Valioso(oro).Es valioso el oro? Esta es una metaYesSi, es la respuesta

?- Valioso(X.).X es una variable, por ello va en maysculaX=oro;Esta es una respuesta. Al agregar el punto y coma se leX=plata;est pidiendo otra respuesta que satisface la metaX=bronce;noCuando ya no encuentra ms respuestas responde con "no".ProgramaEn el programa se ponenmarcasacerca de los predicados que ya han servido de respuesta. Al resatisfacer la meta, las marcas se acumulan. Al solicitar una meta nueva las marcas se "olvidan". A este mecanismo se le conoce como algoritmo de Robinson.Ejemplos:>Le_gusta(juan,maria).A Juan le gusta Mara>Le_gusta(pedro,carla).>Le_gusta(jorge,maria).A estos predicados (de aridad 2) tambin se les conoce como hechos.

?- Le_gusta(X,maria).Meta: A quin le gusta Mara?X=juan;X=jorge;no

?- Le_gusta(X,Y).Responde con todas las combinaciones.

le_gusta_por(juan,maria,ojos grandes).A Juan le gusta Mara por sus grandes ojos.Tiene Aridad 3.Programa:-Es el equivalente a un "if":>Valioso(bronce).>Valioso(X):-X=oro.Si X=oro entonces X es valioso.>Valioso(plata).

?- Valioso(oro).Yes;noProgramaOtros ejemplos:>alguien_es_inteligente.Un predicado de aridad 0>alumno(X,inteligente).X es alumno inteligenteAs se podra generar una lista de juegos con todas las combinaciones:>Nino(1).>Nino(2).>Nino(3).>Nino(4).>Nino(5).>Nino(6).>Juegan(X,Y):-nino(X), nino(Y), XY, write(X, " juega vs. ", Y), nl.Dentro de una declaracin como la anterior a X y a Y se les conocen comoparmetros formales. El punto y coma (;) representa un OR lgico. La coma (,) representa un AND lgico. "nl" representa un cdigo de "nueva linea".?- Juegan(X1,Y1).1 juega vs. 2;...6 juega vs. 5;noProgramaDentro de la meta a X1 y a Y1 se les conoce comoparmetros de meta.Fail"fail" es un predicado que siempre falla. Con esto se obliga a Prolog a buscar una nueva meta. Con ello se evita el tener que poner un punto y coma (;) para pedir que se busque una nueva meta.>Pinta:-write("hola"), fail.

?- Pinta.holaSolo est un "hola" por que el fail no satisface predicados de entrada-salida."not" es la negacin del predicado. Ejemplo:"El barbero es el que rasura a todas las personas que no se rasuran"

>Rasura(juan,juan).>Rasura(barbero,X):-not(Rasura(X,X)).

Quin rasura a Juan??- Rasura(X,juan).X=juan;no

Quin rasura a Pedro??- Rasura(X,pedro).X=barbero;no

Quin rasura al barbero??- Rasura(X,barbero).Se queda sin memoria.ProgramaProlog discrimina maysculas y minsculas slo en la primera letra.__ (guin bajo) es una variable annima:>Le_gusta(juan,maria).>Le_gusta(pedro,carla).

?- Le_gusta(_,X).X=maria;X=carla;noFunctor>Pred1(nombre, Gustos(leer,escribir,nadar)).

?- Pred1(X,Y).X=nombreY=Gustos(leer,escribir,nadar);Y se instancia al predicado "Gustos".nono

?- Pred1(X,Y(Q,R,S)).Si es vlido en Prolog pero no en TurboProlog.Esto es porque TurboProlog es tipificado.Ejemplos:>Hermana(X,Y):-Sexo(X,femenino), Padre(X,Z), Padre(Y,Z), XY.>Suma(X,Y,Z):-Z is X+Y.>Igual(X,Y):-X=Y.La simbologa,AND;OR\=Distinto en PrologisIgualdad en PrologDistinto en TurboProlog=Vlido en TurboProlog con las siguientes reglas:X=4Si X est instanciado se realiza una comparacin.Si X no est instanciado entonces se realiza la instancia.Ejemplo:>Pop(usa,203).>Pop(india,548).>Pop(china,800).>Pop(brasil,108).>Area(usa,3).>Area(india,1).>Area(china,4).>Area(brasil,3).>Density(X,Y):-Pop(X,P),Area(X,A), Y is P/A.

?- Density(china,X).x=200ProgramaOtro ejemplo:>Padre(juan,luis).>Padre(juan,pedro).>Hermanos(luis,andres).>Hermanos(luis,joaquin).>Madre(maria,carmen).>Madre(laura,marta).

?- Padre(X,Y), fail.X=juanY=luisX=juanY=padreno

?- Padre(juan,pedro), hermanos(luis,jorge), madre(maria,carmen).siPrimero se ejecuta Padre(juan,pedro) y responde sinoComo hermanos(luis,jorge) falla, regresa un no y ya no se ejecuta la ltima.Recursin>repeat.Funcin de salida, condicin terminal. No hace nada.>repeat:-repeat.Funcin recursiva, al solicitar una nuevameta se limpian las marcas.Al no guardar variables no se le acaba la memoria ya que no debe de "regresar".>Escribe:-repeat,write("hola"),nl,fail.

?-Escribe.hola?-repeathola...ProgramaUn ejemplo de la recursin es la funcin factorial. En el factorial 0!=1 es la condicin de salida, mientras que n!=n*(n-1)! es el predicado recursivo.Una definicin circular no tiene condicin de salida y se le acaba la memoria. Ejemplo:>Padre(X,Y):-Hijo(Y,X).>Hijo(A,B):-Padre(B,A).ListasLas listas son las nicas estructuras de datos dentro de Prolog.[] Es una lista vaca, no tiene elementos.[a,b,c] Es una lista de tres elementos. "a" es la cabeza de la lista, el primer elemento. [b,c] es el "resto", es una lista con los dems elementos.Ejemplos:[a,b,c,[X,Z,Y]][1,a,Z,[a],b,[c,[d,[e]]]]

>P([1,2,3])El predicado P es una lista de tres elementos.

?-P([X|Y]).X=1X es la cabezaY=[2,3]Y es el resto

?-P([X,Y|Z]).X=1Y=2Z=[3]Ejemplo:>Member(X,[X|_]).Condicin de salida>Member(X,[_|Y]):-Member(X,Y).Predicado recursivo

?-Member(a,[a,b,c]).X=ayes

?-Member(a,[b,a,c]).X=anoY=[a,c]?-Member(a,[a,c]).yesProgramaEjemplo:>P([1]).

?-P([X|Y]).X=1Y=[]Ejemplo:>Imprime_lista([]).>Imprime_lista([X|Y]):-write(X),nl,Imprime_lista(Y).

?- Imprime_lista([a,b,c]).abcProgramaEjemplo:Q - You are a computerA - I am not a computerQ - Do you speak frenchA - no, I speak german

>Change(You,I).>Change(are,[am,not]).>Change(french,german).>Change(do,no).>Change(X,X).>Alter[[],[]).>Alter([H|T],[X,Y]):-Change(H,X),Alter(T,Y).

?- Alter(You,are,a,computer],Z).H=YouT=[are,a,computer]Z=[X,Y]?- Change(You,X)X=I?- Alter([are,a,computer],Y)H=areT=[a,computer]Y=[X,Y]?-Change(are,X)X=[am,not]?-Alter([a,computer],Y). . .CorteEl corte (cut, !) es un predicado ya establecido en Prolog, corta la ejecucin del programa. Ya no regresa de la recursin.>Member(X,[X|_]):-!,fail.>Member(X,[_|Y]):-Member(X,Y).Da la primera solucin que encuentra y luego termina.Turbo Prolog es un compilador/intrprete orientado a tipos, por ello, antes de usar una variable debe ser declarada. Un intrprete checa la sintxis antes de ejecutar cada lnea, por eso es ms lenta su ejecucin a diferencia de un programa compilado. El intrprete es fcil de debuggear (modificacin de los valores de las variables durante la ejecucin).Tipos de datos en PrologDomains son los tipos de datos con los que se van a trabajar.Predicates es la definicin de los dominios usados por los predicados.Clauses es la definicin de lo que hacen los predicados.Goal es la meta que el programa debe alcanzar. Existen dos tipos: Una meta interna est dentro del programa, solo da una respuesta, Por otra parte una meta externa no est dentro del programa, da todas las respuestas posibles.Dominios posibles: symbol, string, integer, real, symbol* (lista de smbolos), integer* (lista de enteros).Domainsnombre,direccion,telefono=stringedad=integerPredicatesimprimerepeatpersona(nombre,direccion,telefono,edad)Clausesimprime:-persona(X,Y,Z,E),write(X),nl,write(Y),nl,write(Z),nl,write(E),nl,fail.repeat.repeat:-repeat.persona("juan","alabama 1","123",23).persona("pablo","alabama 2","23123",24).persona("maria","alabama 3","343123",20).Goalimprime.ProgramaAssert y RetractAade clusulas al cdigo. Al principio: asserta. Donde se encuentre el apuntador: assert. Al final: assertz. En Turbo Prolog slo se pueden aadir hechos y no reglas. Durante la ejecucin del programa se genera una base de datos en donde se almacenan los hechos.Borra un hecho o predicado. Hablando propiamente lo inhibe. Ejemplo:Prolog:Suicidio:-repeat, retract(_), fail.

TurboProlog:retralall(_).Ejemplo de conjugacin de verbos regulares:/* Conjugacin de verbos */

DomainsLista=string*

Predicatespide_verbomember(Symbol,Lista)encuentra_sufijo(string,string,integer)encuentra_prefijo(integer,string,string)toma_elemento(lista,string)conjuga(symbol,string,string)Goalclearwindow,pide_verbo.Clausestoma_elemento([],_):-nl,!.toma_elemento([Head|Tail],Prefijo):-write(Prefijo,Head),nl,toma_elemento(Tail,Prefijo).pide_verbo:-write("Dame un verbo regular "),readln(Verbo),str_len(Verbo,LongVerbo),encuentra_sufijo(Verbo,Sufijo2,2),Numpref=LongVerbo-2,encuentra_prefijo(Numpref,Verbo,Prefijo),!,conjuga(preterito,Prefijo,Sufijo2),readchar(_),!,nl,conjuga(presente,Prefijo,Sufijo2),readchar(_),!,nl,conjuga(futuro,Prefijo,Sufijo2),readchar(_),!,nl,pide_verbo.pide_verbo.encuentra_prefijo(Numero,Palabra,Prefijo):-frontstr(Numero,Palabra,Prefijo,_).encuentra_prefijo(_,_,"").encuentra_sufijo(Palabra,Sufijo,Cuantos):-str_len(Palabra,Longitud),Longitud>=(Cuantos+1),PosInicial=Longitud-Cuantos,frontstr(PosInicial,Palabra,_,Sufijo).encuentra_sufijo(_,"",_).conjuga(preterito,Prefijo,ar):-toma_elemento([,astes,,amos,astis,aron],Prefijo).conjuga(presente,Prefijo,ar):-toma_elemento([o,as,a,amos,as,an],Prefijo).conjuga(futuro,Prefijo,er):-toma_elemento([o,es,e,emos,es,en],Prefijo).ProgramaSegunda versin del programa Member1.-Considere el siguiente programa:a:-b,write("Exito").a:-write("Falla").b:-c(X),d(X),!,e(X),f(X).b.c(1).c(2).c(3).d(3).e(1).e(2).f(1).Si se pide al intrprete la meta ?-a. Qu responde el sistema? Describase paso a paso el funcionamiento de Prolog para resolverlo.Tarea 1 Programa 12.-Supngase que se tiene una lista: [a,b,c,d,e,f,g], hganse los siguientes predicados recursivos:quinto(Lista,X), el cual entrega el quinto elemento de una lista dadaultima(Lista,X), el cual entrega el ltimo elemento de una lista dadaenesimo(Lista,posicion,X), entregar el ensimo elemento de una listaLos errores deben ser manejados.Tarea 1 Programa 23.-Supngase que tenemos el siguiente predicado:delete(_,[],[]).delete(Head,[Head|Tail],Tail).delete(Token,[Head|Tail],[Head|Result]:-delete(Token,Tail,Result).Este predicado remueve slo la primera ocurrencia de un elemento especfico dentro de una lista. Escrbase un predicado recursivo que remueva todas las ocurrencias de un elemento en una lista. Ejemplo:?- nuevo_del(a,[a,c,b,a,d,a],X).X=[c,b,d]Tarea 1 Programa 3Sistemas ExpertosUn sistema experto es un programa de computadora que trata de emular la accin de un experto en un campo dado. El programa trabaja en un dominio limitado (micro-cosmos). Ejemplos:MedicinaInfeccin en sangre (Mycin)Enfermedades pulmonares (Infermo)GeologaProspector. Encontr molibdeno con valor de 6 mdd.ComputadorasR. Un sistema de Digital que propone sistemas de redes. Tiene 7000 reglas.Reconocer fallas en equiposAdministracinHearSay. Reconocimiento de voz y escrituraPartes de un sistema expertoInterfaz con el usuario. Es la manera con la que se comunica con el usuarioMotor de inferencias (lgica)Base de conocimientosUn sistema experto debe explicar sus diagnsticos y conocimientos. Tambin debe poder trazar su lnea de razonamiento (inferencias).Antecedentes de sistemas expertosParry (paranico) y Eliza (psicologo) Usaban palabras claves y preguntaban por palabras relacionadas.SHRLOU (Escrito por Winograd y Weizenbaum en 1972) Entenda semntica y sintxis, es decir lenguaje natural. Realizaba acciones sobre su microcosmos: "Poner un cubo sobre la esfera", "poner una pirmide bajo la mesa".La simulacin de la inteligencia es sencilla.Motor de inferenciasBlackboard: "Mdulos" expertos que se ayudan entre s hasta conseguir la respuesta. HearSay no los usa.Reglas de produccin: Backward chaining (encadenamiento hacia atrs) y Forward chaining (encadenamiento hacia adelante). Siguen los If-Then es decir causas y efectos.Frames (Minsk.) Se topa con el problema de ramificacin de informacin. Informacin arquetpica. No se puede describir algo al 100%. No se usa ya que puede dar informacin irrelevante.Las formas de llegar al resultado:Backward: Intenta llegar al resultado usando las preguntas como gua.Forward: Intenta comprobar un resultado a base de preguntas.Base de conocimientosInformacin relevante para la solucin de un problema. La debe de proporcionar un humano experto en la materia. La diferencia entre un sistema experto y un humano radica en que a mayor datos un sistema experto toma ms tiempo para analizarlos todos, el humano necesita menos tiempo porque se concentra en los datos ms relevantes segn su experiencia.El sistema experto debe poder decir qu hizo y cmo lo hizo. Debe ser capaz de "recordar" los datos ya dados y usarlos; ya sean estos atemporales (nombre) o temporales (temperatura).Juego del GatoSistema experto "Perros"Sistema experto "Killer"Sistema experto de Mecnica automotrizLectura de archivosCrucigramas 2 M 1 B R A V E 4 R Q K U 3 R E A l I Z E T T EFuncin HashCreacin de ndices para ordenar rpidamente datos, asigna valores reproducibles para los elementos que se desean ordenar:a puede valer 1m puede valer 13o puede valer 24

"amo" valdra 38.Pero pueden existir colisiones:o puede valer 24m puede valer 13a puede valer 1

"oma" valdra 38.Por lo que no se podra distinguir entre una y otra. Una solucin es asignar peso a la posicin:amo = 1 + 13 * 2 + 24 * 3 = 99oma = 24 + 13 * 2 + 1 * 3 = 53A este tipo de asignacin de valores se le conoce como funcin Hash.Bsqueda binariaEn Pascal:Program BusquedaBinaria;ConstNumeroDeDatos=100;Typestr80 = string[80];str20 = string[20];RecDic = recordpalabra:str20;end;Varcadena:str80;i,j,k,m:integer;j1:real;flag:boolean;NombreEnArreglo:str80;Diccionario:RecDir;Entrada,Salida:file;

Procedure BusquedaLineal(cadena:str80);BEGINflag:=false;Assign(Entrada,"Dic.txt");Reset(Entrada);m:=filesize(Entrada);for i:=1 to m dobeginread(Entrada,Diccionario);NombreEnArreglo:=Diccionario.palabra;if NombreEnArreglo=cadena Then flag:=TRUE;end;if flag=TRUE Then writeln("Encontrado!");close(Entrada);END;

Procedure Busca(cadena:str80);BEGINflag:=FALSE;k:=0;Assign(Entrada,'Dic.txt');Reset(Entrada);m:=filesize(Entrada);repeatj:=(k+m) div 2;seek(Entrada,j);read(Entrada,Diccionario);NombreEnArreglo:=Diccionario.palabra;if cadena=NombreEnArreglo thenbeginflag:=TRUE;writeln("Encontrado en la posicin ",j+1);end;if cadenaNombreEnArreglo then k:=j+1;if k>m thenbeginj:=0;writeln("Nombre no encontrado");flag:=TRUE;end;until flag=TRUE;close(Entrada);END;

BEGINclrscr;write(Dame la palabra: ); readln(cadena);Busca(cadena);BusquedaLineal(cadena);END.Diccionario muestraBsqueda binaria en PrologLaberintos en Prolog Inicio ---| |----------- | 1| 2 3 4| 5 6| | | | | --| | 7| 8 9|10|11|12| | -----| | | | |13 14 15|16|17|18| |--| | | | | | |19|20|21 22|23|24| | | |-----| | | |25|26 27 28 29|30| | |-----| |--| | |31 32 33 34 35 36| --| |------------ FinalOtros Ejemplos:Impresin de una lista:print([]).print([X|Y]):-write(X),nl,print(Y).

Toma dos listas y nelas:append([],List,List).append([X|List1],List2,[X|List3]):-append([List1,List2,List3).

Cuntos elementos tiene una lista?list_length([],0).list_length([_|Tail],Number):-list_length(Tail,Count),Number=Count+1.

Aade un elemento a la cabeza de la lista:add_element(X,List,[X|List]).

Escribe una lista alrevs:Clausesreverse_list([],[]).reverse_list([Head|Tail],List):-reverse_list(Tail,X),append(X,[Head,List]).Domainslist=char*Predicatesreverse_list(list,list).append(list,list,list).

Libreras para el uso de cadenas:

wordcount("",0).wordcount(Str,Count):-!,strsfind(Str," ",Pos),frontstr(Pos,Str,_,Newstr),wordcount(Newstr,Oldcount), Count=Oldcount+|.

strsfind(Srcstr,Substr,Pos):-str_len(Srestr,Size),str_len(Substr,Ssize),matchs(Srestr,Substr,Ssize,Sub1),Pos=Size-(Ssize+Sub1)+1.

matchs(Str1,_,_,_).matchs(Str1,Str2,Size,Sub1):-frontstr(Size,Str1,Firts,Rest),First=str2,str_len(Rest,Sub1).matchs(Str1,Str2,Size,Sub1):-ftontchar(Str1,_,Rest),!,matchs(Rest,Str2,Size,Sub1).

Predicatesstrsfind(string,string,integer).wordcount(string,integer).matchs(string,string,integer,integer).FactorialEl factorial de 0 es 1.El factorial de n>0 (entero) es igual a n veces el factorial de n-1.En Pascal:function factorial(N:integer):integer;beginif N=0 thenfactorial:=1;elsefactorial=N*factorial(N-1);end;En Prolog:factorial(0,1).factorial(N,FactN):-N>0,M=N-1,factorial(M,FactM),FactN=N*FactM.Raz cuadradaImprimir la raz cuadrada de 1 a 5.En Pascal:for i:=1 to 5writeln(i+" "+sqrt(i));En Prolog:print_square_root(I):-I>5,!.print_square_root(I):-R=sqrt(I),write(I),write(" "),write(R),nl,NewR=I+1,print_square_root(NewR).-:-Una definicin circular como:perro(X):-canino(X).canino(X):-perro(X).No funciona ya que no tiene salida. Para evitar este tipo de situaciones existe el operador bicondicional (-:-):prove(Goal):-call(Goal).prove(GoalA):-(GoalA-:-GoalB),call(GoalB).prove(GoalB):-(GoalA-:-GoalB),call(GoalA).Con esto podemos redefinir perro y canino:perro(fido)canino(rolf)perro(X)-:-canino(X).

?- perro(X)X=fido

?- canino(X)X=rolf

?- prove(perro(X))X=fidoEjemplo, derivadas:d(X,X,1).d(C,X,0):-atomic(C).d(u+v,X,A+B):-d(u,X,A),d(v,X,B).d(u*V,X,B*u+A*V):-d(u,X,A),d(v,X,B).d(n*X,X,n):-atomic(n).Entrada y salidawritewrite(x1,x2,x3,...), write("Hola ",X). Ejemplo:Domainsintegerlist=integer*Predicateswritelist(integerlist)write5(integerlist,integer)Clauseswritelist(NL):-nl,write5(NL,0),nl.write5(TL,5):-!,nl,write5(TL,0).write5([H|T],N):-!,write(H," "),NL=N+1,write5(T,NL).write5([],_).file_strfile_str(FileName,Text) Text es una variable tipo string de 64kb. FileName es el nombre del archivo. El archivo debe ser abierto antes de poder escribir en l:openwrite(SymbolicFN,DosFN).openappend(SymbolicFN,DosFN).openmodify(SymbolicFN,DosFN).Tambin se puede abrir para lectura con: openread(SymbolicFN,DosFN). Ejemplo:Domainsfile=entradaClausesopenread(entrada,"datos.dat").filestr(entrada,Texto).filemodefilemode(SFN,FileMode). FileMode puede ser 0 para archivos de texto y 1 para archivos binarios. As mismo es necesario cerrar el archivo una vez que se han terminado de hacer operaciones en l. closefile(SFN).Tambin existen nombres de "archivos" especiales que se refieren a dispositivos (DFN. Device File Name), estos son:com1keyboardprinterscreenSe pueden redireccionar la salida o la entrada estndar con: readdevice(SFN) o writedevice(SFN). SFN=Symbolic File Name. Ejemplos:Domainsfile=destinationGoalopenwrite(destination,"mydata.dat"), writedevice(destination), write("Hola"),writedevice(screen), closefile(destination).Otro ejemplo:Domainsfile=myfilePredicatesreadloopGoalopenwrite(myfile,"try.txt"), writedevice(myfile),readloop,closefile(myfile).Clausesreadloop:-readchar(X),X'#',!,write(X),readloop.readloop.fileposfilepos(SFN,Filepos,Modo). FilePos es un real redondeado positivo con la posicin en la que se encuentra el apuntador del archivo. Modo puede ser 0: relativo al principio del archivo, 1: a partir de la posicin actual y 2: relativo al final del archivo. Ejemplo:Domainsfile=inputPredicatesinspect_positionGoalreadln(Filename), openread(input,Filename),inspect_position.Clausesinspect_position:-readdevice(keyboard),nl,write("position number?"),readreal(X),readdevice(input),filepos(input,X,0),readchar(Y),write("char is ",Y),inspect_position.eof, existfile, deletefile, renamefile, diskeof(SFN) Es verdadera si el apuntador del archivo ya est al final del mismo.existfile(DosFileName) Es verdadero si existe un archivo con ese nombre.deletefile(DosFileName) Borra el archivo.renamefile(DosFileNameOld,DosFileNameNew) Renombra el archivo.disk(Path) Cambia el path (camino) donde se buscarn los archivos. Si Path no est instanciado, entonces se iguala al path actual.Programa que maneja archivosEscribe un archivo en pantalla en forma espiralVentanas en TurboPrologmakewindow/8 (makewindow de aridad 8)makewindow(#w,scrAtt,frAtt,Heading,Row,Col,Height,Width).

#w Nmero de ventanascrAtt Forma anteriorfrAtt Color del marco (0:sin marco)Height Alto de la ventana, incluyendo el marcoWidth Ancho de la ventana, incluyendo el marcoColoresMonocromticosValorCaracteresFondo 0NegroNegro 7BlancoNegro 112NegroBlancoPasos para calcular el valor del color1.- Se elige un color de caracteres y otro para el fondo.2.- Se suman ambos valores.3.- Se aade 128 si se quiere que parpadeen.Colores de caracteresValorColor 0Negro 16Azul 32Verde 48Cyan 64Rojo 80Morado 96Cafe112BlancoColores de fondoValorColor 0Negro 1Azul 2Verde 3Cyan 4Rojo 5Morado 6Cafe 7Blanco 8Gris 9Azul claro 10Verde claro 11Cyan claro 13Morado claro 14Amarillo 15Blanco de alto contrasteshiftwindow(#w)Pone la ventana w como ventana activa.clearwindow()Limpia el contenido de la ventana activa.removewindowBorra la ventana activa.cursor(Y,X)Mueve el cursor a la posicin Y,X. Si no estn instanciadas entonces regresa las coordenadas Y,X donde se encuentra el cursor.makewindow/11makewindow(#w,scrAtt,frAtt,Heading,Row,Col,Height,Width,clearwindow,frameStrPos,BorderChars).

clearwindow: 0 no limpia el espacio de la ventana. 1: Si la limpia.frameStrPos: 255: Centra el ttulo de la ventana. 0: Ttulo pegado a la izquierda.BorderChars: "\218\191\192\217\196\179" borde sencillo, "\201\187\200\188\205\186" borde doble. "++++-|" Pondra "+" en las esquinas, "-" en la superior e inferior y "|" a la derecha e izquierda.existwindow(#w)Verifica si existe la ventana #w.resizewindow()Permite al usuario redimensionar la ventana con las flechas.gotowindow(#w)Es igual al shiftwindow pero es ms rpido. Las ventanas no deben estar encimadas.framewindow(frAtt)Cambia el atributo de marco en la ventana activa.edit/2edit(IntString,OutString). Llama al editor de prolog.edit/13edit(IntStr,OutString,HeadStr,HeadStr2,Msg,InitPos,HelpFileName,EditMode,Indent,Insert, TextMode,RetPos,RetStatus).HeadStr: Tamao de Instr.HeadStr2: Nombre de archivo donde se salvar OutString.Msg: Mensaje que aparecer al final de la ventana.InitPos: Posicin donde se situa al cursor.HelpFileName: Archivo que se abrir si se oprime F1.EditMode: 0, ReadOnly; 1, Write.Indent: 0, no permite la indentacin; 1, si la permite.Insert: 0, no permite la insercin; 1, si la permite.TextMode: 0, binario; 1, texto.RetPos: Variable donde se pondr la posicin del cursor al acabar la edicin.RetStatus: 0, F10; 1, ESC. Es la forma de salir del editor.dirdir(Path,FileSpec,FileName). Abre una ventana donde se permite escoger un archivo.file_strfile_str(File,String). Lee un archivo y lo guarda en String. Si String tiene algn valor entonces se "sube" al archivo.Con esta predicado se puede abrir un directorio:directorio:-makewindow(32,31,30,"Directorio",10,10,10,65),clearwindow,dir(" ","*.*",_,1,1,1),removewindow.Editor de texto en Turbo Prolog.Corrector Ortogrficoex("v","enb",[],"p").ex("v","malb",["malbaratar"],"sb").ex("v","abe",["abecedario","adedul","abeja"],"p").ex("v","bicio",[],"s").ex("v","b","cav",["caviar","cavilar","cavar"],"p").

mensaje:-(1,Prefijo,Palabra,Letra):-makewindow(.0,79,79,"Diagnstico",12,1,8,46),clearwindow,writedevice(screen),write("Las palabras que empiezan con "),write(Prefijo),nl,write("se escriben con "),write(Letra),nl,nl,write("La palabra: "),write(Palabra),write("est mal escrita.").

editor:-makewindow(31,31,30,"Archivo a editar?",10,10,10,65),clearwindow,trap(dir(" ","*.*",FileName,1,1,1),E,error(E)),FileName"",file_str(FileName,Str),removewindow,makewindow(32,112,126,"Editor",3,3,22,75),clearwindow,EditMode=1,Indent=0,Insert=1,TextMode=1,edit(Str,Out," ",FileName,"Oprima F10 para continuar o ESC paracancelar",0,"C:\prolog.hlp",EditMode,Indent,Insert,TextMode,_),lineinput(10,10,50,21,14,"Nombre del archivo a salvar: ",FileName,NewFileName),file_str(NewFileName,Out),removewindow.

directorio:-makewindow(32,31,30,"Directorio",10,10,10,65),clearwindow,dir(" ","*.*",_,1,1,1),removewindow.

shell_dos:-system("").

despliega(Letrero,FileName,Attrib,FAttrib):-EditMode=0,Indent=0,TextMode=0,trap(file_str(FileName,Str),E,error(E)),makewindow(3,Attrib,FAttrib,Letrero,4,3,19,75),clearwindow,edit(Str,_,FileName,FileName,"Oprima ESC para salir",0,"C:\prolog.hlp",EditMode,Indent,Insert,TextMode,_,_),removewindow.Predicado que lee un archivo y lo despliega en pantalla:file_str(Nombre,Str),write(Str).Predicado que lee un archivo caracter por caracter y lo despliega en pantalla:readloop:-readchar(X),Xeof(Ent),write(X),!,readloop.goalopenread(Ent,N),readdevice(Ent),readloop,closefile(Ent).frontchar/3frontchar("Hola",X,Y). X="H" Y="ola" Este ejemplo convierte una cadena a una lista de caracteres:String_Chr("",[]).String_Chr(S,[H|T]):-fontchar(S,H,S1),String_Chr(S1,T).fronttoken/3fronttoken(Str,Token,RestoStr).fronttoken("Hola cara de bola",T,R)T=Hola (Symbol)R="cara de bola"Este ejemplo transforma una cadena a una lista de smbolos:String_Token(S,[H|T]):-fronttoken(S,H,S1),!,Strinf_Token(S1,T).String_Token(_,[]).frontstr/4frontstr(#,cadena,cad1,resto)frontstr(4,"Manuel",A,B).A="Manu"B="el"concatconcat("mkdir ",DestinoDir,Comando).system(Comando,0,_).Nmeros maravillososUn nmero es maravilloso si es divisible entre 2 (nmero par) y al mismo tiempo es el resultado de (n*3)+1 (nmero impar). Por definicin 1 es maravilloso.Domains X=integerPredicates M(X) Busca(X)Clauses M(1):-write(1). M(X):-(X-1) MOD 3=0,X MOD 2=0,write(X," "). M(X). Busca(Z):-M(Z),W=Z-1,W>0,!,Busca(W).Goal Busca(50)Grficas en TurboPrologUtiliza la biblioteca BGI de Borland. Las definiciones estn en el archivo grapdecl.pro.initgraph/5initgraph(GrDriver,GrMode,NewD,NewM,Path)GrDriver: Manejador grfico, 0 para que lo detecte solo.NewD y NewM son variables que se instancian con el tipo de grficos que se estn usando.closegraph/0Cierra el modo grfico.getx/1 y gety/1Regresan la posicin X,Y donde se encuentra la pluma.moveto/2 y moverel/2Mueve la pluma a las coordenadas dadas, ya sean absolutas (moveto) o relativas (moverel).getmaxX/1 y getmaxY/1Regresan las dimensiones del monitor.line/4, linerel/2 lineto/2Dibuja una lnea entre los puntos dados, o desde la posicin actual de la pluma hasta la coordenada dada, ya sea absoluta o relativamente.circle/3Dibuja un crculo con centro en X,Y y de radio R. circle(X,Y,R).rectangle/4Dibuja un rectngulo con las coordenadas dadas.outtext/2 y outtext/3outtext(String), outtext(X,Y,String). Escribe un texto en la pantalla.