write tutorial semantica primer predicados orden logica formularios ejemplos animales prolog

tutorial - red semantica de animales en prolog



Cómo verificar si existe una regla en una base de datos de cláusulas de archivo prolog (2)

Estoy trabajando en una tarea universitaria donde debo verificar si existe una determinada cláusula (como un hecho o como una regla) en la base de datos actual de la cláusula.

La idea es usar una regla cuya cabeza sea verificar (+ nombre, + argumentos). Esta regla debería ser verdadera si en la base de datos existe otra regla cuyo encabezado es nombre (argumentos)

Cualquier ayuda sería muy apreciada ...


¿Estás familiarizado con el concepto de unificación? Lo que tienes que hacer es: simplemente llama a un predicado que se parece al que estás tratando de encontrar.

Entonces, digamos en su base de datos es:

father(abraham,isaac).

Ahora quieres llamar a algo como:

verify(father,[abraham,isaac]).

Su cuerpo predicado tendrá que contener un mecanismo de llamar father(abraham,isaac). que luego debería volver true. Llamar al father(abraham,adam) debería fallar.

Necesitará dos predicados para esto: =../2 y call/2 . Si está utilizando SWI-Prolog, llame a help(=..). y help(call) desde la línea de comando del intérprete para acceder a la documentación.

Espero no haber estropeado la tarea para ti. Todavía tiene que averiguar qué hacer con los predicados parcialmente instanciados (por lo tanto, diga algo como verify(father,[abraham,X]). por su cuenta, pero no debería ser difícil desde aquí.

Buena suerte.


Usar call/1 no es una buena idea porque call/1 realmente llama al objetivo, pero solo quiere saber si existe el hecho / regla, y no desea esperar después de un largo cálculo de que la llamada podría disparar, y no desea tener algo impreso en la pantalla si la regla llamada a su vez llama, por ejemplo, writeln/1 . Además, querría verify/2 para tener éxito incluso si la llamada falló (pero el hecho / la regla es lo contrario).

Como solución, SWI-Prolog ofrece callable/1

callable(+Term) True if Term is bound to an atom or a compound term, so it can be handed without type-error to call/1, functor/3 and =../2.

Aquí hay dos versiones de verify/2 , una usando call/1 y la otra usando callable/1 .

verify1(Name, Arguments) :- Term =.. [Name | Arguments], call(Term). verify2(Name, Arguments) :- Term =.. [Name | Arguments], callable(Term). father(abraham, isaac) :- writeln(''hello''). father(abraham, adam) :- fail.