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

Правила Пролога с процедурной точки зрения могут действовать как предложения 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 будет вызвана с соответствующим значением аргумента и будет вызвано одно из первых трех правил этого примера.

Задание

Domains

автор=автор(имя,фамилия)

книга=книга(тема_книги,название_книги)

тема_книги,название_книги,имя,фамилия=symbol

код_сотрудника,группа=integer

Predicates

студент(имя,фамилия,группа)

сотрудник(имя,фамилия,код_сотрудника)

информация_книга(книга,автор)

выбор_меню(integer)