Чтобы проверить, является ли треугольник равносторонним, это довольно просто.Чтобы проверить, является ли это равнобедренным, это немного менее тривиально.Вот мое решение:
seg_length(X1,Y1,X2,Y2,D):-
D is sqrt(((X2-X1)**2)+((Y2-Y1)**2)).
equilateral(point2d(X1,Y1), point2d(X2,Y2), point2d(X3,Y3)):-
seg_length(X1,Y1,X2,Y2,D),
seg_length(X2,Y2,X3,Y3,D),
seg_length(X3,Y3,X1,Y1,D).
isosceles(point2d(X1,Y1), point2d(X2,Y2), point2d(X3,Y3)):-
seg_length(X1,Y1,X2,Y2,D1),
seg_length(X2,Y2,X3,Y3,D2),
seg_length(X3,Y3,X1,Y1,D3),
L = [D1,D2,D3],
sort(L,LS),
length(L,LenL),
length(LS,LenLS),
LenL \== LenLS.
Чтобы проверить, равны ли хотя бы две стороны, я использую sort/2
, который удаляет дубликаты из списка.Если два списка имеют одинаковую длину, это означает, что все три стороны различны, и поэтому треугольник не равнобедренный.