Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
IIS / Лекции / ЛР 2 4 - Prolog задание 3.doc
Скачиваний:
37
Добавлен:
31.03.2015
Размер:
86.02 Кб
Скачать

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) )