Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






CLAUSES. singleFact(, ).






singleFact(" ", " ").

 

Single-факты нельзя удалять. Если будет попытка применить retract к single-факту, то компилятор выдаст ошибку 249 " Attempt to retract a fact declared as single".·С момента, когда один случай single-факта существует, обращение к этому факту никогда не будет неудачным, если его вызывают со свободными аргументами. Например, следующий запрос:

singleFact(X, Y).

никогда не терпит неудачу, если X и Y - свободные переменные. Поэтому, удобно использовать single-факты в процедурах. Предикаты assert, asserta, assertz и consult применяются к single-фактам подобно предикатам retract и assert. То есть предикаты assert (consult) заменяют существующий случай факта на указанный.

Предыдущий single-факт позволяет компилятору произвести оптимизированный код для того, чтобы обеспечить оптимальное обращение к факту и обновление факта. Например, для предиката assert, примененного к single-факту, компилятор производит код, который работает более эффективно, чем, например, предикаты retract и assert, примененные к determ-факту (и тем более эффективнее, чем предикаты retract и assert, примененные к nondeterm-факту).

Сохранение базы данных фактов во время выполнения программы

Предикат save сохраняет факты из указанной секции фактов в файл. save требует один или два аргумента.

Если вы вызываете, save только с одним аргументом (без имени секции фактов), то он сохранит факты из базы данных dbasedom в файл по имени fileName.

Если вы вызываете, save с двумя аргументами (именем файла и именем секции фактов), то он сохранит все факты секции фактов databaseName в указанный файл.

К предикатам, принадлежащим секции фактов, можно обращаться точно так же как и к другим предикатам. Единственное различие состоит в том, что описания для предикатов находятся в секции фактов, а не в секции предикатов.

Рассмотрим пример, в котором необходимо найти всех женщин:

1. Для решения этой задачи опишем раздел доменов:

DOMAINS

имя = string

пол = char

2. Следующий раздел, который мы опишем - раздел фактов:

FACTS

человек(имя, пол)

3. Раздел предложений будет выглядеть следующим образом:

CLAUSES

человек(" Helen", 'Ж').

человек(" Maggie", 'Ж').

человек(" Suzanne", 'Ж').

человек(" Per", 'M').

4. Для нахождения женщин необходимо задать следующую цель (рис. 1):

GOAL

человек(Name, 'Ж').

 

Рис. 1. Вывод результата первой цели

 

5. или человек(" Maggie", 'Ж'), чтобы проверить, описана ли женщина по имени Maggie (Мэгги) в секции фактов. Пролог ответит «Да» (рис. 2).

 

Рис. 2. Вывод результата второй цели

 

Предикаты, находящиеся в секции фактов, всегда не определены. Поскольку факты можно добавить в любое время в периоде исполнения программы, компилятор должен всегда предполагать, что возможно найти альтернативные решения в процессе бэктрэкинга. Если вы имеете предикат в секции фактов, для которого вы никогда не будете иметь больше чем одного факта, вы можете описать его как детерминированный, при помощи директивы компилятора determ:

FACTS

determ daylight_saving(integer)

 

Вы получите ошибку, если пробуете добавить факт для детерминированного предиката, который уже имеет факт (рис. 3).

 

Рис. 3. Сообщение об ошибке

 

6. Рассмотрим другой пример. Предположим, что вы имеете следующие секции фактов в вашей программе:


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.006 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал