Чтение онлайн

на главную - закладки

Жанры

Программирование на языке пролог
Шрифт:

Чем отличаются следующие два вопроса?

/* 1 */?- принадлежит(Х,[а,b,с]), write(X).

/* 2 */?- not(not(принадлежит(Х,[а,b,с]))), write(X).

Может показаться, что между ними нет никакой разницы, так как в запросе 2 принадлежит(Х,[а,b,с,])согласуется, поэтому not(принадлежит(Х,[а,b,с,]))не согласуется и not(not(принадлежит(Х,[а,b,с])))согласуется. Это правильно лишь отчасти. В результате первого вопроса будет напечатан атом ' а', а в результате второго – неконкретизированная

переменная.Рассмотрим, что происходит при попытке доказать согласованность первого целевого утверждения из второго вопроса:

1. Целевое утверждение принадлежитсогласуется, и Xконкретизируется значением а.

2 Предпринимается попытка доказать согласованность первого целевого утверждения not,которая заканчивается неудачей, так как целевое утверждение принадлежит,являющееся его аргументом, согласуется с базой данных. Теперь вспомним, что, когда целевое утверждение не согласуется, все конкретизированные переменные, такие как Xв нашем примере, должны теперь «забыть», что они обозначали до сих пор. Следовательно, Xстановится неконкретизированной.

3. Предпринимается попытка доказать второе целевое утверждение not,и эта попытка заканчивается успехом, так как его аргумент (not(принадлежит(…)))не согласован. Переменная Xостается неконкретизированной.

4. Предпринимается попытка выполнить целевое утверждение writeс неконкретизированным значением X. И, как описано в разд. 6.9, неконкретизированные переменные печатаются специальным образом.

6.8. Равенство

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

X=Y

Когда Пролог встречает целевое утверждение X=Y, то он пытается сделать Xи Yравными, сопоставляя их друг с другом. Если сопоставление возможно, то целевое утверждение считается согласованным (а Xи Y, возможно, становятся более конкретизированными). В противном случае целевое утверждение считается несогласованным. Более полное обсуждение этого предиката приведено в разд. 2.4. Предикат равноопределен таким образом, как если бы имел место факт

X = X.

Убедитесь, что вы понимаете, как это определение работает.

X\=Y

Предикат ' \=' является противоположным по отношению к предикату ' =' с точки зрения согласованности с базой данных. Это значит, что X\=Yсогласовано, если X=Yне согласовано, и наоборот. Если целевое утверждение X\ = Yсогласовано ( Xи Yне могут быть сопоставлены друг с другом), то не произойдет никаких изменений в конкретизации Xи Y. Если бы ' \=' не был встроенным предикатом, то мы могли бы определить его на Прологе следующим образом:

X \= Y:- X = Y,!, fail .X \= Y.

X==Y

Предикат '=='

выполняет значительно более строгую проверку на равенство, чем предикат '='. Это значит, что если X==Yвыполняется, то и тем более выполняется X=Y. А обратное заключение не всегда имеет место. Отличие '==' состоит в том, что он более строг к переменным. Предикат '=' предполагает, что не-конкретизированная переменная может быть равна чему угодно, так как она сопоставима с чем угодно. С другой стороны, предикат '==' предполагает, что неконкретизированная переменная может быть равна другой неконкретизированной переменной, лишь когда они уже сцеплены друг с другом. Иначе проверка на равенство заканчивается неудачей. Таким образом, возможен следующий диалог:

?- X==Y.

нет

?- X==X.

X=_23

?- X = Y, X == Y. X = _23, Y = _23

?- присоединить([А|В],С) == присоединить(Х,Y).

нет

?- присоединить ([А|В],С) == присоединить([А|В],С).

А = _23, В = _24, С = _25

Х \== Y

Этот предикат находится в таком же отношении с '==' как '\=' с '='. Это значит, что целевое утверждение, содержащее этот предикат, согласуемо в точности тогда, когда целевое утверждение с '==' не согласуемо, и наоборот. И вновь мы могли бы считать, что этот предикат определен на Прологе следующим образом:

Х\== Y:- X == Y,!, fail.

Х\== Y.

6.9. Ввод и вывод данных

Предикаты для ввода и вывода литер и термов обсуждались в гл. 5. Здесь мы резюмируем наши знания о каждом из этих предикатов.

get0(X)

Это целевое утверждение согласуется с базой данных, если Xможет быть сопоставлена с очередной литерой в текущем входном потоке данных. Цель get0выполняется лишь один раз (его нельзя согласовать повторно). Операция перехода к очередной литере не переделывается при возврате, так как не существует способа поместить литеру обратно в текущий входной поток данных.

get(X)

Это целевое утверждение согласуется с базой данных, если переменная Xможет быть сопоставлена с очередной печатаемой (неуправляющей) литерой в текущем входном потоке данных. Печатаемые литеры имеют код ASCII, превышающий 32. Все управляющие литеры пропускаются. Предикат getвыполняется только один раз (он не может быть согласован вновь). Результат getне устраняется при возврате, так как нет способа поместить литеру обратно в текущий входной поток данных.

skip(X)

Этот предикат читает и пропускает литеры в текущем входном потоке данных до тех пор, пока не встретится литера, сопоставимая с X. Предикат skipвыполняется только один раз.

read(X)

Этот предикат читает очередной терм из текущего входного потока данных и сопоставляет его с X. Предикат readвыполняется только один раз. Вводимый терм должен заканчиваться точкой '.' которая не становится частью этого терма. После точки должна следовать по крайней мере одна управляющая литера. Точка удаляется из текущего входного потока данных.

Поделиться:
Популярные книги

Сын Тишайшего

Яманов Александр
1. Царь Федя
Фантастика:
попаданцы
альтернативная история
фэнтези
5.20
рейтинг книги
Сын Тишайшего

"Искажающие реальность" Компиляция. Книги 1-14

Атаманов Михаил Александрович
Искажающие реальность
Фантастика:
боевая фантастика
космическая фантастика
киберпанк
рпг
5.00
рейтинг книги
Искажающие реальность Компиляция. Книги 1-14

Школа. Первый пояс

Игнатов Михаил Павлович
2. Путь
Фантастика:
фэнтези
7.67
рейтинг книги
Школа. Первый пояс

Невеста на откуп

Белецкая Наталья
2. Невеста на откуп
Фантастика:
фэнтези
5.83
рейтинг книги
Невеста на откуп

Убивать чтобы жить 2

Бор Жорж
2. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 2

Вперед в прошлое!

Ратманов Денис
1. Вперед в прошлое
Фантастика:
попаданцы
5.00
рейтинг книги
Вперед в прошлое!

Аргумент барона Бронина 4

Ковальчук Олег Валентинович
4. Аргумент барона Бронина
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Аргумент барона Бронина 4

Измена. (Не)любимая жена олигарха

Лаванда Марго
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. (Не)любимая жена олигарха

Измена. Право на обман

Арская Арина
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Право на обман

Бастард Императора. Том 7

Орлов Андрей Юрьевич
7. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 7

Жаба с кошельком

Донцова Дарья
19. Любительница частного сыска Даша Васильева
Детективы:
иронические детективы
8.26
рейтинг книги
Жаба с кошельком

Бастард Императора. Том 11

Орлов Андрей Юрьевич
11. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 11

Академия чаросвет. Тень

Ярошинская Ольга
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Академия чаросвет. Тень

Наследие Маозари 4

Панежин Евгений
4. Наследие Маозари
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Наследие Маозари 4