Я делал базу знаний пролога для реализации правил геометрии. При тестировании, если прямоугольник имел правильный угол, я нашел два ответа.Нежелательная оценка на прологе
?- rect_tri(triangle(line(point(0,0),point(0,1)),line(point(0,1),point(1,0)),line(point(1,0),point(0,0)))).
true ;
false.
Вот kwnoledge база:
point(X,Y).
line(X,Y) :- X = point(A,B), Y = point(C,D), not(X = Y).
len(X,R) :- X = line(P,Q), P = point(A,B), Q = point(C,D), not(P = Q),
R is sqrt((A - C) * (A - C) + (B - D) * (B - D)).
triangle(X,Y,Z) :- X = point(A,B), Y = point(C,D), Z = point(E,F),
not(X = Y), not(X = Z), not(Y = Z),
L1 = line(X,Y), L2 = line(X,Z), L3 = line(Y,Z),
len(L1,G), len(L2,H), len(L3,I),
G + H > I, G + I > H, H + I > G.
triangle(X,Y,Z) :- X = line(A,B), Y = line(B,C), line(A,C),
len(X,G), len(Y,H), len(Z,I),
G + H > I, G + I > H, H + I > G.
rect_tri(X) :- X = triangle(A,B,C), len(A,G), len(B,H), len(C,I),
(G is sqrt(H * H + I * I);
H is sqrt(G * G + I * I);
I is sqrt(H * H + G * G)).
При трассировке, я обнаружил, что ответ приходит верно, когда пролог попадает в линию H is sqrt(G * G + I * I)
и ложь, когда он оценивает последнюю строку.
Я не хочу, чтобы произошла последняя оценка, потому что я хочу, чтобы она завершилась, когда было найдено истинное.
Как насчет добавления 'one_rect_tri (X): - once (rect_tri (X)).' И вызов этого вместо 'rect_tri/1'? –