Указание интерпретатору вернуться назад

После того как интерпретатор найдет один ответ на запрос, пользователь может попросить найти еще один ответ. Для этого вводится символ;, который означает отказ от только что полученного ответа. Это заставляет интерпретатор возвратиться назад и приступить к поиску другого ответа. Точнее, ввод символа; приводит к неудаче запроса, активизированного самым последним (т.е. запроса, расположенного в вершине стека).

Предикат “ Сократить

Пространство поиска запроса – это множество всех возможных ответов, рассматриваемых интерпретатором при выполнении запроса. Существует специальный встроенный предикат “ сократить ”, который дает указание интерпретатору не возвращаться назад далее той точки, где стоит этот предикат.

Пример 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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: