logo search
TurboProlog / Документация / TOM_1

Детерминизм и отсечение

Директивы компилятора check_determ является весьма полезной в тех

случаях, когда необходимо определить места для использования отсечения,

поскольку эта директива позволяет отметить те предложения, которые порож-

дают недетерминированные предикаты. Если вы хотите сделать эти предикаты

детерминированными, то вам необходимо ввести в них отсечение, предотвра-

щающее поиск с возвратом (что и порождает недетерминизм). Общим правилом

в таких случаях является введение отсечения со смещением влево настолько,

насколько это возможно без ущерба для логики работы программы.

Всегда помните следующие два правила, согласно которым компилятор

выявляет недетерминированные предложения:

1. Если в предложении нет отсечения и присутствует еще одно пред-

ложение с такими же аргументами в головной части предложения.

2. В теле предложения стоит обращение к недетерминированному пре-

дикату и после этого обращения отсутствует отсечение.

Второе правило может выполняться в следующих случаях:

- при обращении к недетерминированному предикату, объявленному

программистом

- при обращении к предикату динамической базы данных, перед кото-

рым отсутствует директива determ

- при обращении к одному из следующих специализированных стандар-

тных предикатов db_btrees, db_chains, chain_terms или retract,

когда перед предикатом динамической базы данных отсутствует ди-

ректива determ

383