PROLOG retract its not working

240 views Asked by At

I need to delete an item from a list of predicates, but it's not working. It returns true for me yet the item is still there.

Code:

eliminar :- limpar,
    write('\n*** DELETAR ***\n'),
    write('O que deseja deletar ?\n'),
    pegarString(X),
    doenca(X),
    format('~Doença: ~w ~n Sintoma: ~w ~n',[X]),
    retract(doenca([X,_]));
    write('  ').
pegarString(S) :-
    read_line_to_codes(user_input,C),
    name(S,C).
perguntadd(X) :- limpar,
    write('\n*** ADICIONAR ***\n'),
    write('\nDigite o nome da doença que deseja adicionar\n'),
    pegarString(X).
adicionar(X) :-
    format('Digite o sintoma da doença ~w?~n ',[X]),
    pegarString(I),
    assertz(doenca([X,I])),
    format('~n~w foi adicionado aos registros!~n~n',[X]).
1

There are 1 answers

1
CapelliC On

low level issues in first clause:

...
format('~Doença: ~w ~n Sintoma: ~w ~n',[X]),
retract(doenca([X,_]));
write('  ').

Specially the ';' looks suspicious. I guess you want instead

forall(retract(doenca([X,Sintoma])),
       format('~Doença: ~w ~n Sintoma: ~w ~n',[X,Sintoma])),
write('  ').

Also, I would consider better design to store doenca/2 instead of doenca/1.