Студопедия

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

КАТЕГОРИИ:

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






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






В Прологе существует директива компилятора checkdeterm. Если вставить эту директиву в самое начало программы, то Visual Prolog будет выдавать предупреждение в случае обнаружения недетерминированных предложений в процессе компиляции.

Вы можете превратить недетерминированные предложения в детерминированные, вставляя отсечения в тело правил, определяющих данный предикат. Например, помещение отсечений в предложения, определяющие предикат friend, делает этот предикат детерминированным, поскольку в данном случае обращение к friend может возвратить одно и только одно решение.

 

Использование правил для условного ветвления

Правила Пролога с процедурной точки зрения могут действовать как предложения case, представляя собой булевы функции, а также как оператор GoTo (при использовании cut), и возвращать вычисленные значения.

В случае если мы точно знаем, что решение имеет единственное значение можно использовать предикат cut, который используется для прерывания поиска с возвратом. Отсечение помещается в программу

Одно из основных различий между правилами в Прологе и процедурами в других языках программирования заключается в том, что Пролог позволяет задавать множество альтернативных определений одной и той же процедуры. Человек может быть предком, будучи отцом или матерью, поэтому определение предка состоит из двух правил.

Вы можете использовать множество определений так же, как вы применяете предложение case в Pascal, задавая множество альтернативных определений для каждого значения аргумента (или множества значений аргумента). Пролог же будет перебирать одно правило за другим, пока не найдет то, которое подходит, и затем выполнит действие, заданное правилом.

Встроенный предикат action подразумевает, что переменная уже связана. Если вы вызываете action со свободной переменной в качестве аргумента, то компилятор сгенерирует ошибку.

Отсечение как GoTo

 

predicates

action(integer)

clauses

action(1): -

nl,

write(" You typed l."),

nl.

action(2): -

nl,

write(" You typed two."),

nl.

action(3): -

nl,

write(" Three was what you typed."),

nl.

action(N): -

nl,

N< > 1, N< > 2, N< > 3,

write(" I don't know that number! "),

nl.

goal

write(" Type a number from 1 to 3: "),

readint(Choice),

action(Choice).

Если пользователь нажмет клавиши < 1>, < 2> или < 3>, action будет вызвана с соответствующим значением аргумента и будет вызвано одно из первых трех правил этого примера.

Задание


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

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