2011-12-25 15 views
7

Quello che ho ora controlla che X (Y) non è un fatto accettato nel mio piccolo DB. Poiché X (Y) restituisce false, tenterà di asserirlo. (Mi rendo conto che presenta dei problemi quando X è una regola e non un dato di fatto)Posso usare variabili con assert/1?

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

Per esempio, diciamo che questo fatto è nel DB

mammal(dolphin). 

chiedo ifNotAdd (mammifero, elefante).

Voglio vederlo? mammifero (elefante). è falso e quindi asserisce mammifero (elefante).

Ovviamente il "assert (X (Y))." la linea è sbagliata ma con cosa la sostituisco? Sto recuperando documentazione e forum prolog per la risposta ma senza fortuna finora. Sto anche cercando di scrivere qualcosa che lo farà da solo.

EDIT Ho bisogno di modificare il DB per avere un database dinamico con cui l'utente può interagire. Sto costruendo una macchina argomento e ho bisogno di consentire all'utente di dire al sistema che "conoscono il fatto per certo" in modo che il sistema possa gestire le conoscenze al di fuori del suo dominio.

In vena di http://en.wikipedia.org/wiki/Reason_maintenance

Cheers,

risposta

8

È possibile utilizzare il univ operator=../2 per costruire il termine prima di affermare che (si noti che il predicato in questione deve essere dichiarata dinamica per farlo funzionare):

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

BTW se si vuole ifNotAdd/2 non fallire se non ha bisogno di aggiungere il fatto di db, si dovrebbe avvolgere che in una struttura di se, più, not/1 è deprecato, (\+)/1 è preferito:

:- dynamic(mammal/1). 

mammal(dolphin). 

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

ma non sono sicuro di quello che stai cercando di fare è proprio lì. Abbastanza spesso quando un principiante in prolog vuole manipolare il database è perché un particolare meccanismo di prologo non è ben compreso. Poi di nuovo potresti non essere un principiante e la mia osservazione potrebbe essere stupida, nel qual caso, dimenticala! Ma se lo fai sei un principiante, potresti voler precisare ciò che stai cercando di ottenere qui in modo che possiamo confermare che tali manipolazioni sono necessarie!

+0

Ah ah, di solito non uso() solo per la leggibilità quando lo hackerò insieme per la prima volta anche se è deprecato. Dovrebbe averlo cambiato per il post. Ad ogni modo è esattamente quello che stavo cercando. Non ho usato prolog dal momento in cui l'ho imparato da un po 'di tempo fa e sto riapprendendo. Totalmente dimenticato '= ../2' in modo che risolva quello. Chiarirò il programma sopra. –

+0

sulla tua modifica: sembra un valido motivo per manipolare il db:] – m09