Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по языку Пролог.doc
Скачиваний:
84
Добавлен:
28.06.2014
Размер:
507.39 Кб
Скачать

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