Inteligencia Artificial Maestrı́a y Doctorado en Ciencias Computacionales / INAOE Dra. Angélica Muñoz Meléndez Ejercicios de Programación Lógica Objetivos Habilitarse en la práctica de la programación lógica. Ejercicios (1) Escriba un programa en Prolog que reciba como primer argumento una lista cuyos elementos pueden ser sublistas anidadas a distintas profundidades, y devuelva en un segundo argumento una lista aplanada, es decir una lista cuyos elementos se han fundido en una lista de un solo nivel. Por ejemplo si nuestro principal predicado se llama aplanar2 las siguientes son respuestas correctas del programa. ?- aplanar([a,b,c],Y). Y = [a, b, c] . ?- aplanar([a,[b,c],[d,e,[f,[g]]]],Y). Y = [a, b, c, d, e, f, g] . ?- aplanar([[[[a],[b,c]],[d,[e]]],[f],[g]],Y). Y = [a, b, c, d, e, f, g] . (2) Escriba un programa en Prolog que intercambie dos elementos de una lista dadas sus posiciones y devuelva el resultado en una nueva lista. El programa recibe las posiciones de los elementos a intercambiar y la lista original. Por ejemplo si el predicado principal se llama intercambia4 , las siguientes son respuestas correctas del programa. ?- intercambia(1,5,[a,b,c,d,e,f,g,h],L). L = [e, b, c, d, a, f, g, h] . ?- intercambia(5,3,[1,2,3,4,5,6],L). 1 L = [1, 2, 5, 4, 3, 6] . ?- intercambia(5,5,[1,2,3,4,5,6],L). L = [1, 2, 3, 4, 5, 6] . ?- intercambia(5,7,[1,2,3,4,5,6],L). false. ?- intercambia(X,Y,[1,2,3,4,5,6],[1,2,5,4,3,6]). X = 3, Y = 5 . (3) Escriba un programa en Prolog que recorra en profundidad un árbol ternario y que calcule la suma de cada rama desde la raı́z hasta una hoja. Las sumas resultantes deben regresarse en una lista en el orden inverso al seguido al recorrer el árbol. Por ejemplo para el árbol ilustrado en la Figura 1, suponiendo que el principal predicado del programa se denomina sumaprof 2 , la siguiente es la respuesta esperada del programa. Figura 1: Árbol con nodos de tres hijos ?- sumaprof(a(3, a(5, a(7, nil, nil, nil), a(8, nil, nil, nil), a(9, nil, nil, nil)), a(6, a(8, nil, nil, nil), a(9, nil, nil, nil), nil), nil),Sumas). Sumas = [3, 9, 18, 17, 17, 16, 15] 2