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 — прямоугольник с вертикальными и горизонтальными сторонами.