- •Лабораторная работа № 6 Программирование интеллектуальных систем на языке Пролог Управление ходом выполнения программ в системе Турбо-Пролог (1 часть)
- •Работа системы Турбо-Пролог при выполнении запросов
- •Унификация термов
- •I I
- •1 1 1
- •1 1 1
- •Поиск с возвратом при выполнении Пролог-программ
- •Использование отката после неудачи при использовании внутренней цели для организации простейшего интерфейса вывода
- •Include "lab3.Рго"
- •Порядок выполнения лабораторной работы
I I
written_by("H.Бpaтко" , book(" Программирование на языке Пролог",560) ).
т.е. Х конкретизируется константой "И.Братко", а Y принимает значение структуры book( "Программирование на языке Пролог" ,560). Система Турбо-Пролог помечает эту точку указателем возврата и выдаст на экран сообщение.
Х = "И.Братко" Y = book(" Программирование на языке Пролог" ,560)
Так как мы задавали запрос как внешнюю цель, система возвращается в точку, помеченную указателем возврата и продолжает, начиная с этой точки, процесс унификации и находит второе предложение, которое также может быть согласовано с запросом. После унификации переменных система выдает на экран Х = "Ц.Ин, Д.Соломон" Y = bооk("Использование Турбо-Пролога",608) 2 и заканчивает процесс унификации.
Если введем запрос written_by(Х,book("Использование Турбо-Пролога",Y)), то попытка унификации переменных с первым предложением программы будет выглядеть так:
written_by( Х , book( "Использование Турбо-Пролога", Y )
l l
written_by("И.Братко" , book("Программированис на языке Пролог" ,560) ).
Так как Х свободна, то она принимает значение константы "И.Братко", и делается попытка установить соответствие между двумя структурами. Но составной объект согласуется с другим составным объектом при условии, что они оба имеют один и тот же функтор, одинаковое количество аргументов, и все аргументы могут быть попарно унифицированы. Однако, константа "Использование Турбо-Пролога" может быть унифицирована только со свободной переменной или сама с собой. Так как между первыми двумя компонентами структуры book соответствие невозможно, то формируется признак неудачи, и система пытается согласовать цель со следующим предложением программы, переходя к проверке соответствия между:
written_by( Х , book(" Использование Турбо-Пролога", Y ) ).
l l
written_by("Ц.Ин, Д.Соломон " ,book(" Использование Турбо-Пролога",608) ).
Свободная переменная Х унифицируется с константой "Ц.Ин, Д.Соломон". Обе структуры имеют один и тот же функтор book, содержат равное число компонентов, и первые компоненты обеих структур - одинаковые константы. Т.е. эти структуры могут быть унифицированы, и при этом константа 608 унифицируется с переменной Y. Т. е. цель достигнута, и Турбо-Пролог выводит сообщение:
Х = "Ц.Ин, Д.Соломон" Y = 608
Наконец, рассмотрим выполнение запроса: Iong_novel (X). Прежде всего система пытается отыскать предложения, заголовки которых согласуются с запросом.
long_novel( Х )
l
long_novel( Title ) :-written_by( _ , book(Title,Length)) , Length > 600.
После этого согласовываются левая и правая части правила. Переменные Х и Title согласуются, т.к. они свободны и становятся одной и той же переменной. Затем Турбо-Пролог объявляет первое предложение указанного выше правила подзадачей и делает попытку ее унификации:
written_by( _ ,book( Title , Length) )
1 1 1
written_by("И.Бpaткo" ,book(" Программирование на языке Пролог", 5б0 ) ).
Так как анонимная переменная согласуется с любым объектом и структуры book также согласуются, то эти два предиката могут быть унифицированы. В результате этого переменная Title принимает значение "Программирование на языке Пролог", а переменная "Length' становится равной 560.
После этого делается попытка согласовать вторую подзадачу тела правила, а именно: Length &rt; 600. Перед попыткой унификации связанная переменная Length заменяется своим численным значением 560. Так как выражение: 560 > 600 ложно, то Турбо-Пролог делает возврат назад к уже доказанной подцели и пытается его передоказать. Т.е. снова пытается унифицировать первую подзадачу
written_by( _ ,book(Title,Length)),
используя следующий из имеющихся фактов
written_by( _ ,book(Title,Length)), используя следующий из имеющихся фактов
written_by( _ ,book( Title , Length) )