#prolog
#пролог
Вопрос:
Я довольно новичок в prolog, и мне нужно проверить, образуют ли точки равнобедренный треугольник, но я получил эту ошибку. ОШИБКА: аргументы недостаточно созданы. Я не уверен, что я сделал не так.
расстояние, похоже, работает нормально, но проблема связана с равнобедренными.
/*Is the triangle isosceles?*/
isosceles(point2d(X1,Y1), point2d(X2,Y2), point2d(X3,Y3)):-
distance( point2d(X1,Y1), point2d(X2,Y2), D ) =:= distance( point2d(X2,Y2), point2d(X3,Y3), D );
distance( point2d(X2,Y2), point2d(X3,Y3), D ) =:= distance( point2d(X1,Y1), point2d(X3,Y3), D );
distance( point2d(X1,Y1), point2d(X3,Y3), D ) =:= distance( point2d(X1,Y1), point2d(X2,Y2), D ).
distance(point2d(X1,Y1), point2d(X2,Y2), D):-
D is sqrt((X2 - X1)^2 (Y2 - Y1)^2).
?- isosceles(point2d(0,0), point2d(2,4), point2d(5,0)).
ERROR: Arguments are not sufficiently instantiated
ERROR: In:
ERROR: [11] distance(point2d(0,0),point2d(2,4),_10064)=:=distance(point2d(2,4),point2d(5,0),_10084)
ERROR: [10] isosceles(point2d(0,0),point2d(2,4),point2d(5,0)) at /home/checkman123/prolog-geometry/threepoints.pl:25
ERROR: [9] <user>
РЕДАКТИРОВАТЬ: итак, я думаю, что у меня это работает? используя вместо этого. Я все еще хочу знать, почему =:= не работает.
Комментарии:
1. Это не работает, потому
distance( point2d(X1,Y1), point2d(X2,Y2), D )
что не вычисляется числовое значение, с которым можно сравнить=:=
. ВместоD
этого создается экземпляр со значением, которое вы хотите иметь при сравнении. Итак, вам нужно создать aD1
с одной стороны, aD2
с другой, а затем вызватьD1 =:= D2
. Ошибка в настоящее время вводит в заблуждение, кажется=:=
, что она не включается, пока не будут заземлены как левая, так и правая стороны, что не так. Как только они появятся, он все равно будет жаловаться »distance/3
это не функция».2. я вижу thx! @DavidTonhofer
Ответ №1:
Это то, что говорит Дэвид, после факторизации повторных вычислений:
iso(point2d(X1,Y1), point2d(X2,Y2), point2d(X3,Y3)):-
distance( point2d(X1,Y1), point2d(X2,Y2), D12 ),
distance( point2d(X2,Y2), point2d(X3,Y3), D23 ),
distance( point2d(X1,Y1), point2d(X3,Y3), D13 ),
(D12 =:= D13; D23 =:= D13; D13 =:= D12).