<div class="notebook"> <div class="nb-cell markdown" name="md1"> ### Ejemplos de prolog para la clase lenguajes de programación semestre I 2019 Universidad Nacional de Colombia. </div> <div class="nb-cell markdown" name="md8"> ### Desarrollado por: - Juan Manuel Alvarez - Cristian Santos - Nicolás Campuzano </div> <div class="nb-cell markdown" name="md4"> ### Ejemplo 1: Hechos y Reglas Mediante este ejemplo demostramos el uso basico de hechos y reglas en prolog. Un **hecho** es un predicado que se escribe en la base de conocimiento y siempre es **verdadero.** Una **regla** es un predicado que puede o no ser verdadero, a partir de sus **variables** de entrada. </div> <div class="nb-cell program" data-singleline="true" name="p1"> %---Axiomas y predicados padre(jose,jesus). padre(jesus,tomas). padre(tomas,alejandro). padre(tomas,alvaro). padre(alvaro,tom). padre(alvaro,jerry). padre(jeronimo,gustavo). padre(tom,sergio). padre(jesus,nicolas). hijo(X,Y) :- padre(Y,X). abuelo(X,Y) :- padre(X,Z), padre(Z,Y). hermano(X,Y) :- padre(Z,X), padre(Z,Y), X \== Y. tio(X,Y) :- padre(Z,Y), hermano(Z,X). </div> <div class="nb-cell query" name="q2"> hermano(alejandro,alvaro). </div> <div class="nb-cell markdown" name="md6"> ### Ejemplo 2: Máximo de una lista En Prolog este ejercicio es interesante debido a que las listas se ven como una cabeza y una cola, donde la cabeza es el primer dato y la cola son los datos restantes. Con el siguiente código podemos recorrer la lista en búsqueda del máximo número. </div> <div class="nb-cell program" name="p5"> max(A,B,A) :- A >= B. max(A,B,B) :- A < B. maxl([H],H). maxl([H|T],M):- maxl(T,M1), max(M1,H,M). % Maximo de una lista </div> <div class="nb-cell query" name="q4"> maxl([-9,2,1,9,4,5,8],X). </div> <div class="nb-cell markdown" name="md5"> ### Ejemplo 3: Fibonacci Mediante este ejemplo veremos como se construyen *funciones* en Prolog, la manera particular de devolver un resultado y el proceso de backtracking. </div> <div class="nb-cell program" name="p3"> fib(1, 1). fib(2, 1). fib(N, Result) :- N1 is N - 1, N2 is N - 2, fib(N1, Result1), fib(N2, Result2), Result is Result1 + Result2. </div> <div class="nb-cell query" name="q3"> fib(10,Y). </div> <div class="nb-cell markdown" name="md3"> ### Ejemplo 4: Un Sistema Experto En inteligencia artificial, un sistema experto es un sistema computacional que emula la capacidad de tomar decisiones de un humano experto. Un sistema experto esta compuesto de una base de conocimiento y un motor de inferencia, el cual recibe las caracteristicas de una entidad o un problema. Comparando el conocimiento previo existente en la base de conocimientos con las caracteristicas de la entidad es posible identificarla y, por consecuencia, producir un diagnostico o deduccion. </div> <div class="nb-cell program" name="p2"> %Animal Identification Game %Start with ?- go. go:- hypothesis(Animal), write('El animal es: '), write(Animal), nl, undo. %Hypothesis that should be tested hypothesis(Ciprinodontiformes):- Ciprinodontiformes, !. hypothesis(Poecilidos):- Poecilidos, !. hypothesis(anabatidos):- anabatidos, !. hypothesis(Ciclidos):- Ciclidos, !. hypothesis(Pez_desconocido). /* no id*/ %Hypothesis Identification Rules Ciprinodontiformes :- verify(boca_pequeña), verify(vive_en_los_ríos_de_América_del_Sur), verify(macho_posee_Gonopodio), verify(hembra_es_3_cm_más_grande_que_el_macho). Poecilidos :- verify(tiene_manchas_a_lo_largo_del_cuerpo), verify(color_gris), verify(rayas_verdes), verify(raza_Gambusia). Ciclidos :- verify(boca_pequeña), verify(pezunias), verify(cuello_largo), verify(manchas_oscuras). zebra :- verify(mamifero), verify(rayas_negras), verify(pezunias). /* how to ask questions */ ask(Question) :- write('El animal tiene la siguiente caracteristica?: '), write(Question), write('? '), read(Response), nl, ( (Response == yes ; Response == y) -> assert(yes(Question)) ; assert(no(Question)), fail). :- dynamic yes/1,no/1. /* How to verify something */ verify(S) :- (yes(S) -> true ; (no(S) -> fail ; ask(S))). /* undo all yes/no assertions */ undo :- retract(yes(_)),fail. undo :- retract(no(_)),fail. undo. </div> <div class="nb-cell query" name="q1"> go.El animal tiene la siguiente caracteristica?:rayas_negras mamifero? pezunas </div> <div class="nb-cell markdown" name="md7"> ## Ejemplo 5: QuickSort QuickSort es uno de los algoritmos más usado para ordenar listas, en este caso mostramos como se haría en Prolog. La lógica que se sigue es separar la lista, y aplicar quicksort a cada una de las dos listas resultantes, de esta manera se sigue hasta llegar al caso base. </div> <div class="nb-cell program" name="p4"> quicksort([],[]). quicksort([H|T], Q) :- separar(H, T, Men, May), quicksort(Men, M1), quicksort(May, M2), append(M1,[H|M2],Q). %separar(Pivote,Lista,Menores,Mayores) separar(_,[],[],[]). separar(X,[A|B],[A|Men],May) :- A =< X, separar(X, B, Men, May). separar(X,[A|B],Men,[A|May]) :- A > X, separar(X, B, Men, May). </div> <div class="nb-cell query" name="q5"> quicksort([1,-1,0,3,8], X) </div> <div class="nb-cell markdown" name="md2"> ## Posibles ejercicios siguientes 1. Implemente un programa que dado una lista y un elemento devuelva true en caso de que el elemento se encuentre en la lista. 2. Implemente un programa que nos de el mínimo común multiplo entre dos números. </div> </div>