Использование правил для условного ветвления
Правила Пролога с процедурной точки зрения могут действовать как предложения 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)