Está en la página 1de 9

Universidad Nacional del Altiplano – Puno

Escuela Profesional de Ingeniería de Sistemas


CURSO: INTELIGENCIA ARTIFICIAL

GUÍA ACADÉMICA Nro. 4

TEMA: ENTRADA Y SALIDA ; USO DEL OR

Apellidos y Nombres: ……………………………………… Nro. Matrícula: ….………

OBJETIVOS:

◊ Comprender las entradas y salidas de prolog

◊ Uso de OR.

REQUERIMIENTOS:

◊ PC con Windows y Visual Prolog

PROCEDIMIENTO

En la presente práctica se presentarán una serie de casos en los cuales se


demostrara el uso de funciones de entrada de cadenas de caracteres
(variables) y las salidas de cadenas de caracteres (variables) además del uso
específico del “o lógica” en la producción de predicados.

PARTE 1: SALIDA EN PROLOG.

Seria equivalente a decir cout<< en C++, una función equivalente es write,


que permite mostrar caracteres y variables, para este caso se desarrollara un
programa que permita mostrar un determinado trabajo en la pantalla, para esto
implemente el siguiente código en Prolog.

Domains
nino = symbol
Predicates
nino(symbol) %predicado niño
muestra_texto %predicado para mostrar cadenas sin variables equivalente a
un procedimiento
muestra_nino(nino) %predicado para mostrar cadenas con una variable
equivalente a una función
Clauses
nino("Juan").
nino("Luis").
muestra_texto:-write("Este es un texto"),nl,fail.
muestra_nino(X):-nino(X),write("El nino es:",X),nl,fail.

Como se ha de haber dado cuenta existen tres predicados, los dos últimos
muestran texto con write, ahora ejecute las consultas

Goal muestra_texto.
Resultado:

1
Universidad Nacional del Altiplano – Puno
Escuela Profesional de Ingeniería de Sistemas
CURSO: INTELIGENCIA ARTIFICIAL
Goal muestra_nino(X).
Resultado:

¿Porque muestra dos líneas de respuesta la segunda consulta?:

Para que se utiliza:


nl:

fail:

Recomendación: si no se ha de utilizar el fail cuando se muestra el texto de


salida, empiezan a aparecer las ocurrencias de las búsquedas en forma
repetida, de ahí que al usar write se recomienda usar fail siempre al final.
Nótese además que siempre que utiliza fail se mostrara en la pantalla
“not solucion” al final por esa razón.

Ahora se desea mostrar una serie generada con una lista de juegos con todas
las combinaciones entre tres posibles jugadores que se han de enfrentar, para
lo cual copie el siguiente código:

Domains
nino = symbol
Predicates
nino(symbol)
juegan(nino,nino)
Clauses
nino("Juan").
nino("Luis").
nino("Carlos").
juegan(X,Y):-nino(X),nino(Y), X<>Y,write(X," juega vs.
",Y), nl,fail.

Consulta:

Mostrar todos los que se enfrentan:


Goal juegan(S,T).
Respuesta:

Explique como funciona el predicado juegan:

2
Universidad Nacional del Altiplano – Puno
Escuela Profesional de Ingeniería de Sistemas
CURSO: INTELIGENCIA ARTIFICIAL

3
Universidad Nacional del Altiplano – Puno
Escuela Profesional de Ingeniería de Sistemas
CURSO: INTELIGENCIA ARTIFICIAL

PARTE 2: ENTRADA EN PROLOG.

Seria equivalente a decir cin>> en C++, su equivalente es readln, se utilizara


para este caso un ejemplo en el que se propondrá el ingreso de una variable
por entrada simple que ha de ser reutilizada para escribir un texto con esta
incluida con la salida estándar write.

Domains
nino = symbol
Predicates
escribe(nino).
lee(nino).
Clauses
escribe(X):-write("Ingrese el nombre del niño: "), lee(X),
write("El Nombre ingresado es: ",X), nl, fail.
lee(S):-readln(S).

Consulta:

Ejecutar la siguiente consulta:


Goal escribe(X).
Respuesta:

Descripción: El predicado “escribe” llama al predicado “lee”, el cual lee la


variable S de la ventana con readln (este resultado tendrá que retornar
verdadero por lo que no utilice fail), a continuación write es utilizado para
escribir la variable S que llego como X que se coloca con la expresión “El
nombre ingresado es: ”, X, esto prueba la utilidad de readln para ingresar
variables las cuales no solo se pueden utilizar para mostrar las variables por la
pantalla si no para trabajarlas en predicados.

Recuérdese: que al utilizar “,” es equivalente a “y logico” y los predicados


están cumpliéndose para todos los resultados verdaderos, parando con el fail,
ahora será necesario distinguir del uso de el “;”, “o lógico” poco utilizado pero
necesario.

4
Universidad Nacional del Altiplano – Puno
Escuela Profesional de Ingeniería de Sistemas
CURSO: INTELIGENCIA ARTIFICIAL

PARTE 3: USO DEL O LÓGICO “;”

Antes de ingresar a una aplicación específica veamos una utilidad sencilla del
“o lógico”, copie lo siguiente:

Domains
verdad = symbol
Predicates
mira(verdad)
lee(verdad)
checa(verdad)
revisa(verdad)
Clauses
lee("Juan).
lee("Luis).
checa("Juan").
checa("Pedro").
mira("Juan").
mira("Pablo").
% Faltando por definir el predicado revisa:

Se supone que los predicados mira, lee y checa hacen lo mismo, ver si un
nombre de una persona esta en la lista, apenas esté una persona en la lista su
presencia deberá darse como verdadera (YES el resultado), si la cláusula
seria:

revisa(X):- mira(X), lee(X), checa(X).

Consultas:

Verificar si Pedro revisa:


Goal revisa("Pedro").
Respuesta:

Por qué?

Verificar si Pablo revisa:


Goal revisa("Pablo").
Respuesta:

Por qué?

Verificar si Juan revisa:


Goal revisa("Juan").
Respuesta:

Por qué?

5
Universidad Nacional del Altiplano – Puno
Escuela Profesional de Ingeniería de Sistemas
CURSO: INTELIGENCIA ARTIFICIAL

A pesar de que en el último caso la respuesta es verdadera existe un error es


que solamente tiene que existir un verdadero entre mira, lee o checa para que
la respuesta total sea verdadera es así que la cláusula debió de ser:

revisa(X):- mira(X); lee(X); checa(X).

Consultas:

Verificar si Pablo revisa:


Goal revisa("Pablo").
Respuesta:

Por qué?

Verificar si Juan revisa:


Goal revisa("Juan").
Respuesta:

Por qué?

mira( Lee(X checa( revisa(X):-mira(X), revisa(X):- mira(X);


X) ) X) lee(X),checa(X). lee(X);checa(X).
mira(X) ^ lee(X) ^checa(X) mira(X) v lee(X) v checa(X)
(AND) (OR)
V V V V V
V V F F V
V F V F V
V F F F V
F V V F V
F V F F V
F F V F V
F F F F F
Recuerde: Verdad (V): YES y Falso (F): NOT

PARTE 4: CONTINUANDO EL USO DEL O LÓGICO “;”.

En esta parte se desea mostrar como ingresando predicados relacionados en


este caso “amigo”, se puede buscar cuales son los amigos entre personas,
pero como es una relación uno a uno en pares en ocasiones existe dificultades
que se han de reparar con el “o lógico”, además en esta parte se ha de ver
nuevamente la utilidad de ingresar valores con readln y mostrar los resultados
con write.

6
Universidad Nacional del Altiplano – Puno
Escuela Profesional de Ingeniería de Sistemas
CURSO: INTELIGENCIA ARTIFICIAL

Copie la siguiente secuencia de códigos:

Domains
nombre = symbol
Predicates
amigo(nombre, nombre) % determina el amigo de alguien
Clauses
amigo("Juan", "Pablo").
amigo("Pablo", "Pipo").
amigo("Pablo", "Pedrito").
amigo("Lucho", "Juan").

Consultas:

Quien es amigo de Pablo:


Goal amigo(X, "Pablo").
Respuesta:

Lucho de quien es amigo:


Goal amigo("Lucho", Y).
Respuesta:

Hasta acá se ha constituido quien es amigo de quien, pero falta implementar


la búsqueda de amigos, este debe de retornar todos los amigos de una
persona por ejemplo.

Amigos de Pablo: Juan, Pipo y Pedrito.


Amigos de Juan: Lucho y Pablo

Para saber quienes son amigos de alguien, se tendrían que adicionar las
siguientes cláusulas:

amigo("Pablo", "Juan",).
amigo("Pipo", "Pablo").
amigo("Pedrito", "Pablo").
amigo("Juan", "Lucho").

Ejecute la siguiente consulta y obtendrá el resultado que estaba buscando:

Todos los amigos de Pablo:


Goal amigo(X, "Pablo").
Respuesta: X: Juan
X: Pipo
X: Pedrito

7
Universidad Nacional del Altiplano – Puno
Escuela Profesional de Ingeniería de Sistemas
CURSO: INTELIGENCIA ARTIFICIAL

Obtenemos la respuesta que estábamos buscando, pero ES INCORRECTO,


porque existe redundancia de datos:

amigo("Juan", "Pablo").
amigo("Pablo", "Juan").

Lo correcto es declarar el siguiente predicado:

Predicates
amigos(nombre, nombre) % determina los amigos de Izquierda a
% derecha y de derecha a izquierda
Clauses
amigos(X, Y):-amigo(Y, X); amigo(X, Y).

Ahora borre los predicados amigo que están de más y ejecute las siguientes
consultas:

Todos los amigos de Pablo:


Goal amigos(X, "Pablo").
Respuesta:

Todos los amigos de Juan:


Goal amigos(X, "Juan").
Respuesta:

Todos los amigos:


Goal amigos(X, "Juan").
Respuesta:

Ahora desarrollaremos una interfaz que permitirá al usuario ingresar el nombre


de una persona y se le devolverá como resultado los amigos de esa persona.
Agregue el siguiente código:

Predicates
lee_nombre(nombre) % Lee el nombre de la persona
muestra_amigos(nombre) % Lista los Amigo
main % Predicado principal
Clauses
lee_nombre(X):-write("Ingrese el nombre: "), readln(X).
muestra_amigos(X):-amigos(X,Y), write("El amigo de ", X, "
es: ", Y), nl, fail.
main:-lee_nombre(X), muestra_amigos(X).

8
Universidad Nacional del Altiplano – Puno
Escuela Profesional de Ingeniería de Sistemas
CURSO: INTELIGENCIA ARTIFICIAL

Consultas:

Los amigos de Pablo (Consulte main y luego teclee el nombre de Pablo):


Goal main.
Respuesta:

Los amigos de Juan:


Goal
Respuesta:

Explique como funciona el predicado main:

CONCLUSIONES

RECOMENDACIONES