После того как интерпретатор найдет один ответ на запрос, пользователь может попросить найти еще один ответ. Для этого вводится символ;, который означает отказ от только что полученного ответа. Это заставляет интерпретатор возвратиться назад и приступить к поиску другого ответа. Точнее, ввод символа; приводит к неудаче запроса, активизированного самым последним (т.е. запроса, расположенного в вершине стека).
Предикат “ Сократить ”
Пространство поиска запроса – это множество всех возможных ответов, рассматриваемых интерпретатором при выполнении запроса. Существует специальный встроенный предикат “ сократить ”, который дает указание интерпретатору не возвращаться назад далее той точки, где стоит этот предикат.
Пример 1.
?− a(X), b(Y),!, с(X,Y,Z).
При выполнении данного запроса интерпретатор пройдет через предикат “ сократить ” только в том случае, если подцель а(X) и b(X) окажутся успешными. После того как предикат «сократить» будет обработан интерпретатор не сможет возвратиться назад для повторного рассмотрения подцелей “ a ” и “ b”, если подцель “ с” потерпит неудачу при текущих значениях переменных X и Y.
Проверка типа терма
В языке Пролог имеются встроенные предикаты, предназначенные для проверки типа терма.
var(X) -предикат даст значение истина, если его аргумент будет не конкретизированной переменной.
Пример2.
?− var(X)
да
?− X = лондон, var(X).
нет
nonvar(X) -предикат будет истинным, если его аргумент будет термом любого вида, кроме не конкретизированной переменной.
Пример 3.
?− X = [париж, лондон, нью-йорк, токио], nonvar(X).
да
Действия с текущей программой
Существуют встроенные предикаты, позволяющие программными средствами изменять текущее множество фраз программы.
Предикат assert (принять) добавляет к текущей программе фразу X.
Пример 4.
?− assert(король(людовиг, франция)).
да
?− король(людовиг, X).
X = франция
Предикат retract (удалить) удаляет из текущей программы первую фразу, которая унифицируется с X.
Пример 5.
?− retract(король(людовиг, франция)).
да
?− король(людовиг, X).
нет
Задание итерации
Цель repeat порождает новую ветвь вычислений.
Пример 6.
Данная программа изменяет значение счетчика counter(i) в базе данных от i = 0 до i = 100.
count:- assert(counter(0)),fail.
count:- repeat, counter(X), Y=X+1, retract(counter(X)), aserta(counter(Y)), write(Y), Y = 100.
?- counter(X).
X = 100