ошибка пролога: аргументы недостаточно созданы

#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 этого создается экземпляр со значением, которое вы хотите иметь при сравнении. Итак, вам нужно создать a D1 с одной стороны, a D2 с другой, а затем вызвать 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).