2011-12-25 10 views
7

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. (Sé que esto presenta problemas cuando X es una regla y no un hecho)¿Puedo usar variables con assert/1?

ifNotAdd(X,Y):- 
    not(call(X,Y)), 
    !, 
    assert(X(Y)). 

Por ejemplo, digamos que este hecho está en la base de datos

mammal(dolphin). 

te pido ifNotAdd (mamífero, elefante)

Quiero que vea eso? mamífero (elefante). es falso y luego afirma mamífero (elefante).

Obviamente el "assert (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.

EDIT Necesito editar la base de datos 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

Cheers,

Respuesta

8

Puede utilizar el univ operator=../2 para construir el plazo antes de que la invoca (tenga en cuenta que el predicado en cuestión tiene que ser declarado dinámico para que funcione):

ifNotAdd(X,Y):- 
    not(call(X,Y)), 
    !, 
    Term =.. [X, Y], 
    assert(Term). 

por cierto si quieres ifNotAdd/2 no fallar cuando no tiene que añadir el hecho de que el PP, se debe envolver que en un caso de la estructura, además, not/1 está en desuso, se prefiere (\+)/1:

:- dynamic(mammal/1). 

mammal(dolphin). 

ifNotAdd(X, Y):- 
    ( \+ call(X, Y) 
    -> Term =.. [X, Y], 
     assert(Term) 
    ; true). 

pero no estoy seguro de lo que estamos tratando de hacer es allí mismo. 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 comentario podría ser tonto, 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.

+0

Ah, ja, usualmente uso no() solo para facilitar la lectura al hackearlo la primera vez aunque esté obsoleto. Debería haber cambiado eso para la publicación. De todos modos, eso es exactamente lo que he estado buscando. No he usado prolog desde la clase en la que lo aprendí hace un tiempo y estoy volviendo a aprender. Olvidé por completo '= ../2', así que eso resuelve eso. Aclararé el programa anterior. –

+0

acerca de su edición: parece una razón legítima para manipular la base de datos:] – m09

Cuestiones relacionadas