Page 57 - 4800
P. 57

фактів  повинен  бути  оголошений  глобальним.  Для  цього  потрібно  перед  ключовим
                  словом facts поставити ключове слово global.
                         Імена предикатів бази фактів повинні бути унікальними в модулі (початковому
                  файлі); у двох різних розділах facts не можна застосовувати однакові імена предикатів.
                  Аналогічно,  не  можна  використовувати  однакові  імена  предикатів  в  розділах  facts  і
                  predicates.  Проте  імена  предикатів,  визначених  в  локальних  facts-розділах,  є
                  локальними для модуля, де вони оголошені, і не конфліктують з локальними іменами
                  предикатів/фактів, оголошених в інших модулях.
                         За своєю природою предикати в розділі facts завжди недетерміновані. Оскільки
                  факти можуть бути додані у будь-який момент під час виконання програми, компілятор
                  завжди  повинен  враховувати,  що  існує  можливість  знайти  альтернативне  рішення  в
                  ході пошуку з поверненням. Якщо в розділі facts є предикат, для якого ніколи не буде
                  більше  одного  факту,  то  можна  декларувати  це,  написавши  перед  оголошенням
                  предиката  факту  ключове  слово  determ  (або  ключове  слово  single,  якщо  предикат
                  завжди повинен мати один і лише один факт):
                         facts
                         determ daylight_saving(integer)
                         Відповідно, при спробі додати новий факт для детермінованого предиката бази
                  фактів, який вже має факт, завжди виникатиме помилка.
                         У оголошенні розділу  facts можна використовувати такі необов'язкові ключові
                  слова:
                         facts [– <databasename>]
                         [nocopy]   [{ nondeterm | determ | single }]
                          dbPredicate ['('   [Domain [ArgumentName]]* ')']
                         Необов'язкові  ключові  слова  nondeterm,  determ  і  single  оголошують  режим
                  детермінізму оголошеного предиката бази фактів dbPredicate. Тільки одне з них можна
                  використовувати.  Якщо  режим  детермінізму  предиката  бази  фактів  не  заданий  явно,
                  тоді за умовчанням приймається значення nondeterm. Режим nondeterm для предикатів
                  баз фактів завжди задається за умовчанням, не залежно від установки прапорця Default
                  Predicate Mode в діалоговому вікні Compiler Options VDE.
                         – nondeterm – визначає, що база фактів може містити будь-яке число фактів для
                  предиката бази фактів dbPredicate. Це режим за умовчанням;
                         – determ – визначає, що база фактів може містити не більше одного факту для
                  предиката бази фактів dbPredicate;
                         – single – визначає, що база фактів завжди містить один і лише один факт для
                  предиката бази фактів dbPredicate.
                         –  посору  –  звичайно,  коли  предикат  бази  фактів  викликаний  для  зв’язування
                  змінної з рядковим або складеним об'єктом, викликані дані копіюються з купи (heap) в
                  глобальний  стек  Visual  Prolog  (GStack).  посору  оголошує,  що  дані  не  будуть
                  скопійовані, а змінні посилатимуться безпосередньо на дані факту, що зберігаються в
                  купі. Це може значно збільшити ефективність, але якщо копія не була зроблена, після
                  видалення  факту  змінна  указуватиме  на  якесь  „сміття”.  Тому  використовувати  такий
                  підхід слід обережно.
                         – global – визначає, що база фактів – глобальна. Надійна техніка програмування
                  вимагає,  якомога  меншого  використання  глобальних  фактів.  Натомість  можна
                  застосовувати глобальні предикати, що працюють з локальними фактами.
                         Ключове  слово  nondeterm  визначає  режим  за  замовчуванням  для  фактів
                  (предикатів  бази  фактів),  оголошених  в  розділі  facts.  Якщо  жодне  із  слів  determ  або
                  single не використане при оголошенні фактів, компілятор застосовує режим nondeterm.
                  Звичайно за своєю природою предикати бази фактів недетерміновані. Оскільки факти
                  можуть  бути  додані  у  будь-який  момент  виконання  програми,  компілятор  повинен
                  враховувати, що під час пошуку з поверненням можливо знаходження альтернативних
                  рішень.
                         Ключове слово determ визначає, що база фактів може містити не більше одного
                  факту  для  предиката  бази  фактів,  оголошеного  з  цим  ключовим  словом.  По  цьому,
                  якщо програма намагається встановити інший такий факт у базі даних фактів, Пролог
                  згенерує помилку. Отже, програмісту слід з особливою обережністю використовувати
                  детерміновані факти.
                         Оголошення  факту  детермінованим  дозволяє  компілятору  генерувати





                                                              57
   52   53   54   55   56   57   58   59   60   61   62