2013-07-10 2 views
0

Я делал базу знаний пролога для реализации правил геометрии. При тестировании, если прямоугольник имел правильный угол, я нашел два ответа.Нежелательная оценка на прологе

?- 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) и ложь, когда он оценивает последнюю строку.

Я не хочу, чтобы произошла последняя оценка, потому что я хочу, чтобы она завершилась, когда было найдено истинное.

+1

Как насчет добавления 'one_rect_tri (X): - once (rect_tri (X)).' И вызов этого вместо 'rect_tri/1'? –

ответ

2

Даниэль комментарий, вероятно, показывает наиболее разумный способ решить вашу проблему. Некоторые другие опции ...

в современных компиляторах есть если/то/иначе конструкция:

rect_tri(X) :- X = triangle(A,B,C), len(A,G), len(B,H), len(C,I), 
    ( G is sqrt(H * H + I * I) 
    -> true 
    ; H is sqrt(G * G + I * I) 
    -> true 
    ; I is sqrt(H * H + G * 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) 
    ). 
Смежные вопросы