- •Язык программирования турбо пролог
- •4.4. Переопределение стандартного ввода-вывода
- •4.5. Работа с файлами
- •5. Внутренняя база данных турбо пролога
- •5.1. Объявление внутренней базы данных
- •5.2. Обновление внутренней базы данных
- •5.3. Занесение фактов во время исполнения.
- •5.4. Удаление фактов во время выполнения программы
- •506 Type Error: The functor does not belong to the domain (функтор не относится к данному домену)
- •5.5. Чтение новых фактов иэ файла во время выполнения программы
- •5.6. Сохранение базы данных во время работы программы
- •6. Трассировка и отладка пролог программ
- •6.1. Синтаксическая проверка
- •6.2. Трассировка
- •6.2.1. Директивы трассировки
- •6.2.2. Трассировка в режиме оптимизации: shorttrace
- •6. 2. 3. Трассировка предикатов
- •6.2.4. Предикат trace
- •6.2.5. Диалоговое управление трассировкой
- •6.3. Директивы компилятора и отладка
- •6.4. Сообщения об ошибках во время выполнения программы
- •6.5. Опции компилятора из меню
- •7.Заключение
- •8. Литература:
- •Содержание:
6.2.2. Трассировка в режиме оптимизации: shorttrace
Турбо Пролог использует оптимизацию для увеличения скорости выполнения. Обычно, когда вы используете директиву trace, трассировка дает информацию обо всех операторах CALL и RETURN, которые являются логической частью выполнения программы. Это включает в себя все вызовы и возвраты, которые являются частью цикла хвостовой рекурсии, хотя Турбо Пролог обычно оптимизирует эти вызовы. Вы можете запустить программу в режиме трассировки, при котором используются преимущества такой внутренней оптимизации. В режиме оптимизированной трассировки показываются вызовы хвостовой рекурсии в менее избыточном режиме, но информация по операторам RETURN в этом случае выводится не всегда.
Для трассировки в режиме встроенной оптимизации используйте директиву shorttrace вместо trace. Можно также выбрать Shorttraee иэ меню Option/Compiler Directives/Trace.
Пример. Замените директиву trace в программе CHOI.PRO (рис. 6.2) на директиву shorttrace, после чего для запуска программы нажмите клавиши Alt-R.
Теперь, когда вы нажмете для выполнения программы по шагам клавишу F10, обратите внимание, что Турбо Пролог выводит меньше информации.
6. 2. 3. Трассировка предикатов
Другим способом управления выводимой при трассировке информа цией является трассировка только определенных предикатов. Для этого используются директивы trace и shorttrace с указанием предикатов, например:
trace p1, р2, рЗ,... или shorttrace p1, р2, рЗ,...
Если вы напишете директивы таким способом, трассировка будет показывать CALL и RETURN только для указанных предикатов (р1,р2,рЗ и т.д.).
Пример использования директивы shorttrace.
Files Edit Ru Cornpile Option Setup | |
Editor |
Dialog |
Trace Line 19 Col 24 C: EXAMPLES\CH01 |
p r |
predicates member(elment, list) clauses member( X, [X£_]). member( X, [_£T]):- member( X,T).
go(X) :- member( Y, X), write(Y,"\n"), fail. go(X) :- member( l,X), write("True\n") write("False\n"). | |
Massage |
Trace |
Compiling C:EXAKPLES\CH01.PRO member go member |
REDO: member(?,["r","о","]","о", "g"]) CALL: member(?,["о","l","о","g"] ) |
Fl-Help F2-Save FlO-Stap Shift-Fl0- Resize Alt-T-Trace on/off Esc-End |
Рис. 6.2
shorttrace write_list, assert_fact domains
list = symbol* database
owns (symbol,symbol) predicates
assert_facts gather_goods (symbol)
write_list(list)
clauses
assert_facts:-
assert ( owns(micki,dog) ), assert ( owns(micki,car) ),
assert ( owns(micki,dress) ),
assert ( owns(eloise,car) ),
assert ( owns(claudio,tennis_racket) ), assert ( owns(claudio,sneakers) ),
assert ( owns(kenny,boots) ).
gather_goods (Who) : -
findall (Goods,owns (Who),Goods),Goods_list), write (Who,"owns:\n"),
write_list (Goods_list). write_list ([]) :- !. write_list ([H£T1) :-
write (H,"\n"),write_list (T).
goal
assert_facts,
gather_goods (micki),
write ("Tliat's all!\n").