swipl - swi prolog tutorial
¿Puedo usar variables con assert/1? (1)
Lo que ahora compruebo es que X (Y) no es un hecho aceptado en mi pequeña base de datos. Como X (Y) devuelve falso, intentará afirmarlo. (Me doy cuenta de que esto presenta problemas cuando X es una regla y no un hecho)
ifNotAdd(X,Y):-
not(call(X,Y)),
!,
assert(X(Y)).
Por ejemplo, digamos que este hecho está en el DB
mammal(dolphin).
Pregunto ifNotAdd (mamífero, elefante).
Quiero que vea eso? mamífero (elefante). es falso y luego afirma mamífero (elefante).
Obviamente, "afirmar (X (Y))". línea está mal, pero ¿con qué lo reemplazo? Estoy rastreando la documentación y los foros de Prolog para obtener la respuesta, pero hasta ahora no tuve suerte. También estoy tratando de escribir algo que lo haga por mi cuenta.
EDITAR Necesito editar el DB para tener una base de datos dinámica con la que el usuario pueda interactuar. Estoy construyendo una máquina de argumentos y necesito permitir que el usuario le diga al sistema que "conocen el hecho con seguridad" para que el sistema pueda manejar el conocimiento fuera de su dominio.
En la línea de http://en.wikipedia.org/wiki/Reason_maintenance
Aclamaciones,
Puede usar el operador univ =../2
para construir el término antes de afirmarlo (tenga en cuenta que el predicado en cuestión debe declararse dinámico para que funcione):
ifNotAdd(X,Y):-
not(call(X,Y)),
!,
Term =.. [X, Y],
assert(Term).
Por cierto, si desea que ifNotAdd/2
no falle cuando no necesita agregar el hecho al db, debe ajustarlo en una estructura if, además, not/1
está en desuso, (/+)/1
es preferible:
:- dynamic(mammal/1).
mammal(dolphin).
ifNotAdd(X, Y):-
( /+ call(X, Y)
-> Term =.. [X, Y],
assert(Term)
; true).
Pero no estoy seguro de lo que estás tratando de hacer está ahí. Muy a menudo, cuando un principiante en prólogo quiere manipular la base de datos es porque un mecanismo de prólogo particular no se entiende correctamente. Por otra parte, es posible que no seas un principiante y mi observación podría ser tonta, en cuyo caso, ¡olvídalo! Pero si es un principiante, puede precisar lo que está tratando de lograr aquí para que podamos confirmar que esas manipulaciones son necesarias.