programacion logica primera

1
- Que hace deductiva el prog prolog Las relgas foman el motor de inferencia(Deducción de una cosa a partir de otra) y asi trabaja mas rápido en el programa El Corte "!" Podemos definir el Corte como un predicado que siempre se cumple, es decir, que genera un resultado verdadero en la primera ejecución, y falla en el proceso de backtracking, impidiendo dicho retroceso. Su aplicación principal es generar código más eficiente por el efecto que causa en la reducción o poda del árbol de búsqueda generado durante el procedimiento de resolución. Se trata de un predicado que siempre falla, por tanto, implica la realización del proceso de retroceso para que se generen nuevas soluciones. Con fail podemos forzar a que no pare y siga construyendo el árbol de búsqueda hasta que no queden más soluciones que mostrar predicates nondeterm padre(symbol,symbol) nondeterm madre(symbol,symbol) nondeterm casado(symbol,symbol) nondeterm abuevic(symbol,symbol) nondeterm nieto(symbol,symbol) nondeterm hija(symbol,symbol) nondeterm linda(symbol) %nondeterm primoYtio(symbol,symbol) nondeterm hermana(symbol,symbol) clauses madre(mirian,ricardo). madre(rita,victor). madre(rita,veronica). padre(marcelo,raul). padre(marcelo,rita). padre(juan,marcelo). padre(juan,maria). padre(raul,sergio). padre(sergio,ricardo). linda(mirian). linda(rita). abuevic(A,X):-padre(A,H),madre(H,X),!. abuevic(A,X):-padre(A,H),padre(H,X). nieto(A,X):-abuevic(X,A). hermana(X,Y):-madre(B,X),madre(B,Y),X<>Y. hija(B,X):-hermana(X,Y),madre(B,X),madre(B,Y). casado(A,B):-padre(A,H),madre(B,H),linda(B),!. goal %abuevic(A,victor). %nieto(G,raul). %hermana(Hermana,victor). %hermana(Hermana,veronica). %hija(B,veronica). casado(Casado,Linda). UNIVERSIDAD TECNOLOGICA DEL PERU Programación Lógica Practica dirigida No 1 TIJERA ( CORTE) Ejemplo 1 Determinar los hechos y reglas para calcular la densidad de un país y defina el corte o tijera adecuado para este problema. Considere las siguientes proposiciones: El Perú tiene un área territorial de 24 millones de km cuadrados y una población de 30 millones de habitantes Chile tiene un área territorial de 18 millones de km cuadrados y una población de 24 millones de habitantes. Bolivia tiene un área territorial de 14 millones de km cuadrados y una población de 20 millones de habitantes Considere el cálculo de la densidad poblacional como: D = Población/ (área) 2 . Solución: predicates Población(integer, symbol) Area(integer,symbol) Densidad(real,symbol) clauses /*hechos*/ Población(30,peru). Población(24,chile). población(20,Bolivia). Area(24,peru). Area(18,chile). Área(14,Bolivia). /* Primero busca una solución y si lo encuentra el corte le dice quédate con esta solución */ Densidad (D,P):- población(X,P), Area(Y,P),D=X/(Y*y) /* Esta es una segunda solución porque acepta cualquier país entonces como ya encontró en la primera regla la solución se quedo con la anterior eso hace la tijera. En caso que en la anterior regla no encuentre la solución es decir la regla de falso entonces se evalúa la siguiente regla para buscar una solución */ Densidad(D,_):- write(“NO TENGO INFORMACION”), D=D. Ejemplo 2 Ingresar un entero por teclado y evaluar con un mensaje si es par o impar Domains i=integer Predicates IfMio (i, symbol) Clauses IfMio(X,M):-X mod 2 = 0, M=”PAR”,!. ifMio(_,M):-M=”IMPAR”,!. goal write(“ingrese un numero entero: “), readint(N), ifmio(N,M), readln(_). BUCLE (REPITE…FAIL) Ejemplo 1 Imprimir en forma infinita una cadena predicates Imprimir Repite clauses Imprimir:-repite, write(“Fidel”), fail. Repite. Repite:-repite Ejemplo 2 Se tiene un conjunto de hechos de nombres de personas. Hacer una regla que imprima todos los nombres en pantalla. domains s=string predicates Persona(s) Imprimir clauses % HECHOS Persona(“Silvia”). Persona(“Gerson”.) Persona(“Janet”). Persona(“Luis”). % REGLAS Imprimir:-persona(N), write(“Nombre=”,N), fail. Imprimir. Ejemplo 3 Hacer una regla que me imprima hasta que le diga con un ingreso por teclado de un carácter “N” mientras sea “S” seguirá imprimiendo. predicates Imprimir Repite clauses Imprimir:-repite, write(“Fidel”), write(“Desea continuar S/N=”),readchar(A),A=”N”,!. Repite Repite:-repite Ejemplo 4 Del último ejemplo validar respuestas para que acepte minúsculas s/n predicates Imprimir Repite Convertir(char,char) clauses Imprimir:- repite, write(“Fidel ”), write(“Desea continuar S/N=”), readchar(B),convertir (B,A),A=”N”,!. Convertir (X,Y):-X=”n”, Y= “N”. Convertir (X,Y):-X=”s”, Y= “S”. /*OTRA FORMA NO NECESITAS TIJERA PORQUE TODAS ESTAN RESTRINGIDA POR UNA CONDICION QUE LAS HACE QUE SE DE SOLAMENTE UNA UNICA SOLUCION Convertir (“s”,”S”). Convertir (“n”,”N”). Convertir (“S”,”S”). Convertir (“N”,”N”). */ Repite. repite:-repite Ejemplo 5 Hacer un programa que haya el cuadrado de un numero. El programa pedirá si desea continuar s/n si ingreso “s” o “S” continuara si ingresa “n” o “N” saldrá en caso de ingresar otro carácter sacara un mensaje que solo debe ingresar s/n y otra vez el mensaje si desea continuar s/n. TRACE domains C=char predicates Cuadrado Proceso Repite Ejecuta(c) goal Proceso, Cuadrado, Readln(_). clauses Cuadrado:-repite, Write(“\nDesea continuar s/n =”), Readchar (c), Ejecutar (c), Fail. Proceso:- clearwindow, Write(“EL CUADRADO DE UN NUMERO”),nl, Write(“Ingrese X=”), Readint(X), Y=X*X, Write(“Y=”Y), Readln(_). Ejecuta(“s”).-proceso,l. Ejecuta(“S”).-proceso,l. Ejecuta(“n”).-exit. Ejecuta(“N”).-exit. Ejecuta(_).-clearwindow, Write(“\nIngrese solo s/n”). Repite. Repite:-repite.

Upload: jose-luis-z-arce

Post on 06-Sep-2015

213 views

Category:

Documents


0 download

TRANSCRIPT

- Que hace deductiva el prog prologLas relgas foman el motor de inferencia(Deduccin de una cosa a partir de otra) y asi trabaja mas rpido en el programa

El Corte "!"Podemos definir elCortecomo un predicado que siempre se cumple, es decir, que genera un resultado verdadero en la primera ejecucin, y falla en el proceso debacktracking, impidiendo dicho retroceso. Su aplicacin principal es generar cdigo ms eficiente por el efecto que causa en la reduccin o poda del rbol de bsqueda generado durante el procedimiento de resolucin.Se trata de un predicado que siempre falla, por tanto, implica la realizacin del proceso de retroceso para que se generen nuevas soluciones. Confailpodemos forzar a que no pare y siga construyendo el rbol de bsqueda hasta que no queden ms soluciones que mostrar

predicatesnondeterm padre(symbol,symbol)nondeterm madre(symbol,symbol)nondeterm casado(symbol,symbol)nondeterm abuevic(symbol,symbol)nondeterm nieto(symbol,symbol)nondeterm hija(symbol,symbol)nondeterm linda(symbol)%nondeterm primoYtio(symbol,symbol)nondeterm hermana(symbol,symbol)

clausesmadre(mirian,ricardo).madre(rita,victor).madre(rita,veronica).padre(marcelo,raul).padre(marcelo,rita).padre(juan,marcelo).padre(juan,maria).padre(raul,sergio).padre(sergio,ricardo).linda(mirian).linda(rita).

abuevic(A,X):-padre(A,H),madre(H,X),!.

abuevic(A,X):-padre(A,H),padre(H,X).nieto(A,X):-abuevic(X,A).

hermana(X,Y):-madre(B,X),madre(B,Y),XY.

hija(B,X):-hermana(X,Y),madre(B,X),madre(B,Y).

casado(A,B):-padre(A,H),madre(B,H),linda(B),!.

goal%abuevic(A,victor).%nieto(G,raul).%hermana(Hermana,victor).%hermana(Hermana,veronica).%hija(B,veronica).casado(Casado,Linda).

UNIVERSIDAD TECNOLOGICA DEL PERUProgramacin Lgica Practica dirigida No 1TIJERA ( CORTE)Ejemplo 1Determinar los hechos y reglas para calcular la densidad de un pas y defina el corte o tijera adecuado para este problema. Considere las siguientes proposiciones:El Per tiene un rea territorial de 24 millones de km cuadrados y una poblacin de 30 millones de habitantesChile tiene un rea territorial de 18 millones de km cuadrados y una poblacin de 24 millones de habitantes.Bolivia tiene un rea territorial de 14 millones de km cuadrados y una poblacin de 20 millones de habitantesConsidere el clculo de la densidad poblacional como: D = Poblacin/ (rea)2.Solucin:predicatesPoblacin(integer, symbol)Area(integer,symbol)Densidad(real,symbol)

clauses/*hechos*/Poblacin(30,peru).Poblacin(24,chile).poblacin(20,Bolivia).Area(24,peru).Area(18,chile).rea(14,Bolivia).

/*Primero busca una solucin y si lo encuentra el corte le dice qudate con esta solucin */

Densidad (D,P):- poblacin(X,P), Area(Y,P),D=X/(Y*y)/*Esta es una segunda solucin porque acepta cualquier pas entonces como ya encontr en la primera regla la solucin se quedo con la anterior eso hace la tijera. En caso que en la anterior regla no encuentre la solucin es decir la regla de falso entonces se evala la siguiente regla para buscar una solucin*/Densidad(D,_):- write(NO TENGO INFORMACION), D=D.

Ejemplo 2

Ingresar un entero por teclado y evaluar con un mensaje si es par o impar

Domains i=integer

Predicates IfMio (i, symbol)

Clauses IfMio(X,M):-X mod 2 = 0, M=PAR,!. ifMio(_,M):-M=IMPAR,!.goalwrite(ingrese un numero entero: ),readint(N),ifmio(N,M),readln(_).

BUCLE (REPITEFAIL)Ejemplo 1Imprimir en forma infinita una cadenapredicatesImprimirRepiteclausesImprimir:-repite, write(Fidel), fail.Repite.Repite:-repite

Ejemplo 2

Se tiene un conjunto de hechos de nombres de personas. Hacer una regla que imprima todos los nombres en pantalla.domains s=string

predicates Persona(s) Imprimir

clauses % HECHOS Persona(Silvia). Persona(Gerson.) Persona(Janet). Persona(Luis). % REGLAS Imprimir:-persona(N), write(Nombre=,N), fail. Imprimir.

Ejemplo 3

Hacer una regla que me imprima hasta que le diga con un ingreso por teclado de un carcter N mientras sea S seguir imprimiendo.

predicatesImprimirRepite

clauses

Imprimir:-repite, write(Fidel), write(Desea continuar S/N=),readchar(A),A=N,!.

RepiteRepite:-repite

Ejemplo 4

Del ltimo ejemplo validar respuestas para que acepte minsculas s/n

predicates ImprimirRepiteConvertir(char,char)

clausesImprimir:- repite, write(Fidel ), write(Desea continuar S/N=), readchar(B),convertir (B,A),A=N,!.Convertir (X,Y):-X=n, Y= N.Convertir (X,Y):-X=s, Y= S./*OTRA FORMA NO NECESITAS TIJERA PORQUE TODAS ESTAN RESTRINGIDA POR UNA CONDICION QUE LAS HACE QUE SE DE SOLAMENTE UNA UNICA SOLUCION

Convertir (s,S).Convertir (n,N).Convertir (S,S).Convertir (N,N).*/Repite.repite:-repite

Ejemplo 5

Hacer un programa que haya el cuadrado de un numero. El programa pedir si desea continuar s/n si ingreso s o S continuara si ingresa n o N saldr en caso de ingresar otro carcter sacara un mensaje que solo debe ingresar s/n y otra vez el mensaje si desea continuar s/n.

TRACE domains C=charpredicates Cuadrado Proceso Repite Ejecuta(c)

goal Proceso, Cuadrado, Readln(_).

clauses

Cuadrado:-repite, Write(\nDesea continuar s/n =), Readchar (c), Ejecutar (c), Fail.

Proceso:- clearwindow, Write(EL CUADRADO DE UN NUMERO),nl, Write(Ingrese X=), Readint(X), Y=X*X, Write(Y=Y), Readln(_).

Ejecuta(s).-proceso,l.Ejecuta(S).-proceso,l.Ejecuta(n).-exit.Ejecuta(N).-exit.Ejecuta(_).-clearwindow, Write(\nIngrese solo s/n).Repite.Repite:-repite.