Непредсказуемое поведение динамических предикатов

У меня есть проблема, которая требует, чтобы я добавил в список элементы, распределенные по различным предикатам. Вместо использования списков на основе аргументов я решил использовать предикат динамического списка. I простой пример можно увидеть ниже. Когда я первоначально использовал его, он работал нормально, но теперь, если я использую какой-либо аргумент в качестве X, он продолжает извлекать данные предыдущего аргумента из списка даже после закрытия программы и перекомпиляции. Кто-нибудь знает, что с ним не так?

//list declarations
:- dynamic listD/1.
listD([]).

//pushes X onto the list then retrieves the entire list for verification
sample(X):-
    assert(listD(X)),
    listD(Y),
    write(Y).


Example usage

sample([adam]).
//prints adam fine
sample([fred]).
//prints adam again

person user2211776    schedule 27.04.2013    source источник
comment
потратьте время на изучение правильного Пролога: избегайте утверждений, насколько это возможно   -  person CapelliC    schedule 28.04.2013
comment
мой ответ вообще был полезен? что-то еще не ясно?   -  person Will Ness    schedule 28.04.2013


Ответы (1)


Используйте retractall, чтобы очистить состояние при запуске.

sample(X):-
    retractall(listD(_)),
    assert(listD(X)),
    listD(Y),
    write(Y).
person Will Ness    schedule 27.04.2013