Есть ли встроенный предикат или простой способ удалить из базы данных знаний пролог исходных файлов, с которыми уже проводились консультации? Я просмотрел справочное руководство и не нашел ничего, что могло бы это сделать.Swi Prolog, выгружая исходные файлы
ответ
Вы можете сделать это с этими процедурами, которые используют source_file/1
и source_file/2
:
unload_last_source:-
findall(Source, source_file(Source), LSource),
reverse(LSource, [Source|_]),
unload_source(Source).
unload_source(Source):-
ground(Source),
source_file(Pred, Source),
functor(Pred, Functor, Arity),
abolish(Functor/Arity),
fail.
unload_source(_).
unload_source/1
уничтожает все предикаты, определенные по имени файла входного источника. Будьте предупреждены, что это должен быть абсолютный путь.
unload_last_source/0
получит последнее имя файла и выгрузит его.
После того, как файл проконсультирован, он станет «неактуальным» для Пролога. Поэтому я думаю, что в целом ответ должен быть no. Но SWI-Prolog имеет богатый набор встроенных функций, который позволяет вам контролировать ваш программ. Например
?- [stackoverflow].
?- predicate_property(P, file('/home/carlo/prolog/stackoverflow.pl')).
P = yield(_G297, _G298) ;
P = now _G297 ;
P = x(_G297) ;
...
?- abolish(yield/2).
true.
?- predicate_property(P, file('/home/carlo/prolog/stackoverflow.pl')).
P = now _G297 ;
P = x(_G297) ;
...
Заметим, что отменить не требует имя файла для работы, вы можете удалить предикаты, загруженные из других источников файлов.
clause, clause_property и erase должны дать больше контроля, но я получаю ошибку я не понимаю (это недокументированная) при попытке использовать Erase:
?- clause(strip_spaces(_G297, _G298),X,Y),erase(Y).
ERROR: erase/1: No permission to clause erase `<clause>(0x29acc30)'
, если вы знаете имя предиката, например, факт/2, вы можете использовать:
retractall(fact(_,_)).
применяется только к динамическим предикатам, то есть к тем, которые установлены с помощью 'assert', правильно? –
Действительно, он применим только к динамическим предикатам, но их не нужно утверждать во время выполнения, также может быть объявлено в исходном файле. – Ihmahr
- 1. SWI Prolog: Запросить файлы для справки
- 2. Interprolog и SWI-Prolog
- 3. SWI Prolog - условный NOT?
- 4. SWI Prolog ODBC ошибка
- 5. "strptime" в SWI-Prolog
- 6. SWI-Prolog Puzzle
- 7. Loop in SWI-PROLOG
- 8. SWI Prolog escape quotes
- 9. SWI-Prolog условные операторы
- 10. Структура SWI-PROLOG
- 11. Prolog Список SWI создание
- 12. Пересечение в SWI-Prolog
- 13. Prolog (SWI): строка интерполяция
- 14. Swi Prolog Relation
- 15. SWI-Prolog: «false» где?
- 16. Constraint - SWI-Prolog Queries
- 17. SWI Prolog - Упрощение выражений
- 18. SWI Prolog secure_loaded error
- 19. SWI-Prolog, запись назад
- 20. SWI-Prolog Func пакет
- 21. SWI-Prolog ошибка asserta
- 22. База данных SWI Prolog
- 23. Алгоритм WARMR в ALEPH (SWI-Prolog)
- 24. Решатель уравнений в SWI-Prolog
- 25. вход для файла SWI-Prolog
- 26. Список и реестр SWI-Prolog
- 27. SWI-Prolog tokenize_atom/2 замена?
- 28. Принудительные элементы в SWI-Prolog
- 29. SWI-Prolog Guitracer X-сервер
- 30. SWI-Prolog - Сбой в Утверждают
Существует несколько вариантов реализации Пролога. OP не упоминает о системе Prolog, которую он использует. Это решение работает на SWI-Prolog. Он не будет работать в большинстве других компиляторов Prolog, которые не предоставляют встроенные предикаты source_file/1-2 и/или позволяют исключить статические предикаты. Решения, зависящие от конкретной реализации Prolog, лучше всего обозначаются как таковые. –
@Paulo Moura: OP отметил вопрос как спецификацию SWI-Prolog. Вместо этого вместо этого следует отметить, что отмена работы без учета исходного файла ... – CapelliC