PROLOG убирает его не работает

Мне нужно удалить элемент из списка предикатов, но это не работает. Он возвращает true для меня, но элемент все еще там.

Код:

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]).

person martur94    schedule 25.11.2015    source источник
comment
Предоставьте минимально воспроизводимый пример, демонстрирующий вашу проблему. Из кода, который вы в настоящее время предоставили, невозможно сказать, что происходит.   -  person Steven    schedule 25.11.2015
comment
ok, переизданный, теперь можно увидеть все переменные.   -  person martur94    schedule 25.11.2015
comment
Мне кажется вероятным, что вы определили doenca/1 статически. У вас должна быть строка :- dynamic doenca/1. где-то в начале файла, и мне очень подозрительно, что у вас есть и doenca(X), и retract(doenca([X,I])) в одном и том же теле правила, что просто не может быть успешным. Есть еще источник?   -  person Daniel Lyons    schedule 25.11.2015


Ответы (1)


проблемы низкого уровня в первом предложении:

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

Особенно ';' выглядит подозрительно. Я думаю, вы хотите вместо этого

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

Кроме того, я бы подумал о лучшем дизайне для хранения doenca/2 вместо doenca/1.

person CapelliC    schedule 25.11.2015
comment
Я почти чувствую, что точки с запятой ; в конце строки в коде Prolog должны быть выделены редакторами/IDE как ошибки. - person ; 25.11.2015