Supongamos que una base de datos sobre relaciones familiares se compone de un conjunto de hechos que declaran a los miembros familiares conocidos en base a su sexo y sus progenitores. Por ejemplo: progenitor(pablo, juan). % “pablo es el progenitor de juan” progenitor(maría, juan). hombre(pablo). hombre(juan). mujer(maría). ... Además, la base de datos contiene reglas que definen ciertas relaciones familiares, como la relación abuelo/2: abuelo(X,Y):% "X es el abuelo de Y" progenitor(X,Z), progenitor(Z,Y), hombre(X). A. Definir el predicado comprobar_sujetos/1 que permita verificar que los sujetos que intervienen en una relación de parentesco son conocidos. El argumento debe ser un functor de la relación donde sus argumentos representan a los sujetos. Por ejemplo: ?- comprobar_sujetos(abuelo(luis, juan)). debería fallar, indicando la causa, si alguno de los sujetos no está completamente definido. B. Definir el predicado definido(Cabeza, Cuerpo), tal que compruebe si una determinada relación de parentesco es conocida, p.e. cuando cabeza es tia(X,pedro), y que devuelva en Cuerpo el cuerpo de la definición de la regla. Cuando la regla no se haya definido, debe fallar alertando de este extremo. C. Encontrar una definición del predicado inspecciona(Termino, NVarLibres, Aridad) de manera que siendo el primer argumento un término compuesto, básicamente un functor con argumentos, lo analice y devuelva el número de variables libres y su aridad. D. Definir el predicado ordena_premisas(Lista_P1, Lista_P_Ordenada), tal que dada una lista de premisas como primer argumento, devuelva la misma lista de premisas, pero ordenadas según un criterio que sitúe en primer lugar las premisas más restrictivas. Un criterio podría basarse en considerar como más restrictivas aquellas premisas que involucren predicados con mayor número de variables instanciadas y mayor aridad. E. Dada la lista de variables VarNL y el functor con argumentos Premisa, definir el predicado insertaVarNL(Premisa, VarNL, NvarNL), tal que se devuelva en NvarNL una lista que contendrá la unión de la variables de la lista original con aquellas contenidas en el functor como argumentos.