Эквивалентность программ и данных
Характерной особенностью Пролога является эквивалентность программ и данных - и то и другое может быть представлено логическими термами. Для того, чтобы можно было использовать эту эквивалентность, необходимо, чтобы программы можно было рассматривать в качестве данных, а данные можно было бы превращать в программы.
Смысл предиката call(X) в Прологе состоит в передаче терма X в качестве цели. Доступность метапеременных означает, что в качестве целей в конъюнктивных вопросах и в теле предложений разрешается использовать переменные. В процессе вычисления в момент обращения к такой переменной ей должно быть сопоставлено значение - терм. Если переменной не сопоставлено значение в момент обращения, то возникает ошибочная ситуация.
Вместо вызова предиката call(X) можно писать просто X.
Доступность метапеременных является важным инструментом метапрограммирования, используемым, в частности, при построении метапрограмм, которые обращаются с другими программами как с данными; они выполняют их анализ, преобразование и моделирование. Это же свойство существенно используется при определении отрицания и при определении предикатов высших порядков.
Пример: Определение отрицания.
not X :- X,!, fail.
not X.
Обладаю ли я знаниями? Нет. Но когда низкий человек спросит меня о чем-либо, то, даже если я не буду ничего знать, смогу рассмотреть этот вопрос с двух сторон и обо всем рассказать ему.
Конфуций