Point (X,Y)


□ oint<X1 ,Y>


poitttfX.Y]

Рис. 2.8. Пример вертикального а гори зон-шального отрезков прямой

С этой программой может быть проведен следующий диалог:

?- vertical ( seg{ point {1,1J( point! 1,2) j ). yes

?-vertical ( seg; point11,1) , point !2,Y> ) ). no

;- horizontal( seg( point(1,1) , point (2,Y} ) ), Y - 1

На первый вопрос был получен ответ "yes", поскольку цель вопроса согласуется с одним из фактов программы. Для ответа на второй вопрос не удалось найти какого-либо согласования. При ответе на третий вопрос переменной Y было присвоено зна­чение 1 в результате согласования с фактом о горизонтальных отрезках.

Примером более общего вопроса к этой программе может служить вопрос о том, существуют ли какие-либо вертикальные отрезки, которые начинаются в точке {2,3)?

?- vertical! seg(point(2,3),Р)>. P = point(2,Y}

Этот ответ означает, что таковыми являются любые отрезки прямой, оканчиваю­щиеся в любой точке [2, Y), иными словами, оканчивающиеся в любом месте на вертикальной прямой х = 2. Следует отметить, что фактически ответ системы Prolog может оказаться не таким изящным, как показано выше, но (в зависимости от ис­пользуемой реализации Prolog1) ■может выглядеть примерно так: Р = point <2,_136)

Тем не менее это различие является чисто внешним. В данном случае 136 пред­ставляет собой переменную, которая не была конкретизирована, но 13б — действи­тельное имя переменной, которое было сформировано системой во время выполне­ния. Системе приходится формировать новые имена, чтобы обеспечить возможность переименовать пользовательские переменные в программе. Такая необходимость воз­никает по двум причинам: во-первых, в связи с тем, что одно и то же имя в разных предложениях обозначает различные переменные, и, во-вторых, из-за того, что при последовательных применениях одного и того же предложения каждый раз исполь­зуется его "копия" с новым набором переменных.


Глава 2, Синтаксис и значение программ Prolog



Еще одним интересным вопросом к этой программе может служить вопрос о том, существуют ли отрезки, которые являются одновременно вертикальными и горизон­тальными.

?- vertical! S), horizontal ( S).

s = segl point(X,Y), point(x,Y} )

В этом положительном ответе системы Prolog на заданный вопрос фактически сказано, что любой отрезок, вырожденный в точку, имеет свойство быть вертикаль­ным и горизонтальным одновременно. И в этом случае ответ был выработан просто в результате согласования. Как и в предыдущем случае, вместо имен переменных X и Y в ответе могут появиться некоторые имена, сформированные внутри программы.

Упражнения

2.3. Будут ли следующие операции согласования завершаться успешно или не­
удачно? Если они завершатся успешно, то каковы будут результаты конкрети­
зации переменных?

а) point( А, В) = point С 1, 2).

б) pain ( А, в) = point ( X, Y, 2).

в) plus! 2, 2) = 4.

г) +( 2, D) = ■»( Е, 2).

д) triangle( point(>lr0), Р2, РЗ) = triangle( PI, point(1,0),

point (0,Y)).

В последнем примере результат конкретизации определяет семейство тре­угольников. Какое описание применимо к этому семейству?

2.4. Исдольэуя способ представления отрезков прямых, описанный в данном разде­ле, составьте терм, который представляет любой вертикальный отрезок на прямой линии, заданной уравнением х = 5.

2.5. Предположим, что прямоугольник представлен термом rectangle! PI, P2, РЗ, Р4), где переменными Р обозначены вершины прямоугольника, заданные в определенном порядке. Определите отношение

regular ( R)

которое является истинным, если R — прямоугольник с вертикальными и го­ризонтальными сторонами.