Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Содержание сайт... 65535
Вызов хранимых ... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Организация зап... 65184
Создание отчето... 61658
Модуль Forms 61565
ТЕХНОЛОГИИ ДОСТ... 58136
Пример работы с... 55741
Имитационное мо... 53466
Реклама
Сейчас на сайте
Гостей: 10
На сайте нет зарегистрированных пользователей

Пользователей: 13,069
новичок: momotw
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Программа тестирования (тест) - вступительные экзамены (математика, физи...
Меры близости на векторах в Delphi + Блок схемы
Моделирование системы управления качеством производственного процесса на...

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

ПОДПИСЫВАЙСЯ на канал о программировании
1.3. Переменные


Если вы хотите узнать, что нравится Джону, то было бы утомительно спрашивать «Нравятся ли Джону книги?», «Нравится ли Джону Мэри?» и так далее, получая каждый раз ответ да или нет . Более разумно обратиться к Пролог-системе с просьбой назвать что-нибудь, что нравится Джону. Такой вопрос можно сформулировать следующим образом« «Нравится ли Джону X?». Задавая вопрос, мы не знаем, для обозначения какого объекта использована литера X . Нам хотелось бы, чтобы Пролог перечислил все имеющиеся возможности для обозначения какого объекта использована литера X . В Прологе можно не только присваивать имена конкретным объектам, но и использовать имена, подобные X , для обозначения объектов, которые должны быть определены Пролог-системой. Имена такого типа называются переменными. Переменная в Прологе может иметь либо не иметь конкретное значение. Переменная конкретизирована, если имеется объект, который обозначает эта переменная. Переменная не конкретизирована, если еще не известно, что именно она обозначает. В Прологе используется соглашение, позволяющее отличать переменные от имен конкретных объектов – каждое имя, начинающееся с прописной буквы, рассматривается как переменная.
При поиске ответа на вопрос Пролог организует просмотр всех фактов в базе данных, чтобы обнаружить объект, который эта переменная могла бы обозначать. Так, когда мы спрашиваем «Нравится ли Джону X?», Пролог просматривает все известные ему факты для обнаружения тех вещей, которые нравятся Джону.
Такая переменная, как X , сама по себе не является именем какого-то конкретного объекта, но она может быть использована для обозначения объектов, которым мы не можем дать имя. Например, мы не можем чему-то, что нравится Джону, дать имя как объекту, поэтому для выражения подобных вопросов вместо вопросов вида
?- нравится(джон, Что-то, что любит Джон).
Пролог позволяет использовать переменные и задавать вопросы в виде
?- нравится(джон,Х).
При желании можно давать переменным более длинные имена. Следующий вопрос вполне приемлем в Прологе:
?- нравится(джон, Что-точтонравитсяджону).
Почему? Потому что переменной может быть любое имя, начинающееся с прописной буквы. Рассмотрим следующую базу данных и запрос к Прологу:
нравится (джон,цветы).
нравится (джон,мэри).
нравится(поль,мэри).
?- нравится(джон,Х).
В вопросе спрашивается: Существует ли что-нибудь, что нравится Джону? В ответ Пролог напечатает:
Х=цветы
а затем будет ждать дальнейших приказов; это мы вкратце обсудим далее. Как это произойдет? При поступлении такого вопроса в Пролог-систему переменная, входящая в вопрос, изначально является неконкретизированной. Пролог просматривает базу данных в поисках факта, сопоставимого с вопросом. Если неконкретизированная переменная появляется в качестве аргумента, то Пролог считает, что такой аргумент сопоставим с любым другим аргументом, находящимся в той же самой позиции факта. В нашем примере Пролог ищет любой факт с предикатом нравится и первым аргументом джон . Второй аргумент в этом случае может быть каким угодно, так как в вопросе вторым аргументом является неконкретизированная переменная. При обнаружении такого факта переменная X становится конкретизированной, обозначая объект, являющийся вторым аргументом найденного факта, каким бы этот аргумент ни был. Пролог просматривает факты базы данных в том порядке, в каком они вводились (на печатной странице это соответствует просмотру сверху вниз), поэтому факт нравится(джон, цветы) найден первым. С этого момента переменная X обозначает объект цветы или, говоря другими словами, переменная X конкретизируется значением цветы . Пролог с помощью специального маркера отмечает место в базе данных, в котором произошло сопоставление. Обсудим кратко причины, по которым оказалось необходимым использование такого маркера.
Обнаружив факт, соответствующий вопросу, Пролог печатает имена объектов, которые теперь обозначают переменные. В нашем примере есть только одна переменная X , которой соответствует объект цветы . Затем Пролог ждет дальнейших указаний, как об этом говорилось выше. Если в этой ситуации нажать на терминале клавишу RETURN , указывая тем самым, что вы удовлетворены полученным ответом, то Пролог прекратит дальнейший поиск в базе данных. Если вместо этого нажать клавишу ; (и вслед за ней клавишу RETURN ), то Пролог продолжит поиск в базе данных, начиная с места, отмеченного маркером. В такой ситуации, когда Пролог начинает поиск не с начала базы данных, а с места, отмеченного маркером, мы говорим, что Пролог пытается заново согласовать вопрос.
Предположим, что в ответ на первое найденное Прологом соответствие ( Х=цветы ) мы предлагаем системе продолжить поиск (введя ; ). Это значит, что мы хотим согласовать вопрос иначе; мы хотим найти другой объект, который могла бы обозначать переменная X . Это также значит, что Пролог должен «забыть» о том, что переменная X обозначает цветы , и снова продолжить поиск с неконкретизированной переменной X . Так как мы ищем альтернативное решение, то поиск продолжается с места, отмеченного маркером. Следующий найденный системой факт, соответствующий вопросу, есть нравится(джон,мэри). Переменная X вновь становится конкретизированной, обозначая мэри, а Пролог отмечает маркером факт нравится(джон,мэри). Пролог напечатает Х=мэри и будет ожидать дальнейших команд. Если мы вновь введем точку с запятой, то Пролог продолжит поиск. В нашем примере нет больше ничего, что нравится Джону. Поэтому Пролог завершит поиск и предоставит нам возможность сделать новые запросы или ввести новые факты.
Что произойдет, если, имея те же факты, что и ранее, мы зададим вопрос:
?- нравится(Х,мэри).



В этом вопросе спрашивается: «Существует ли объект, которому нравится Мэри?». Теперь вы сами можете понять, что в примере объектами, которые нравятся Мэри, являются джон и поль . Опять, если бы мы хотели увидеть все варианты, мы должны были бы вводить; после каждого ответа, выдаваемого Прологом:
?- нравится(Х, мэри). наш вопрос
Х=джон; первый ответ. Мы вводим ;
Х=поль; второй ответ. Вновь вводим ; .
нет больше ответов нет.




Опубликовал Kest July 09 2009 15:49:32 · 0 Комментариев · 6790 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Swat [Исходник на...
Globus VCL Extent...
Printgrid
Язык программиров...
Пишем программы и...
netBIOS
Cтатьи Королевств...
INSTANT BOOSTER v...
DelphiX
Мониторинг сервер...
PDJ_Anima
Calendar
DiskInfo
CoolHints2k v1.03
Язык программиров...
CwstatusBar
oTextrackBar
Алгоритм DES шифр...
3d Tank [Исходник...
C# Учебный курс

Топ загрузок
Приложение Клие... 100397
Delphi 7 Enterp... 83968
Converter AMR<-... 20052
GPSS World Stud... 11465
Borland C++Buil... 11291
Borland Delphi ... 8236
Turbo Pascal fo... 6993
Visual Studio 2... 4974
Калькулятор [Ис... 4489
FreeSMS v1.3.1 3517
Случайные статьи
Формы внутреннего ...
Предварительная по...
Г-слоя в физике пл...
Алгоритм с унарным...
Моделирование библ...
Блоки работы с гру...
Решения VPN между ...
Цель преподавания ...
Восстановление дан...
Классы и IDL
Спецификация lOOOB...
Создание манипулят...
Строки не упорядоч...
Как реализуется поиск
ПРЕДИСЛОВИЕ РЕДАКТ...
Протокол LACP IEEE...
Какая логика подра...
Информационные и с...
29.100.
Операторы ввода-вы...
Объектная модель M...
кроме субботы с 18...
Сохранение файла T...
Gain followers
Передачи файла
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?