序言-错误:没有充分实例化参数

时间:2020-11-06 14:27:24

标签: 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 个答案:

答案 0 :(得分:2)

在对重复计算进行因子分解后,David的意思是这样:

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).