0

ジオメトリ ルールを実装するためのプロローグ ナレッジ ベースを作成していました。長方形に直角があるかどうかをテストすると、2 つの答えが見つかりました。

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

ここに知識ベースがあります:

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

トレースすると、prolog が行にヒットすると true が返さH is sqrt(G * G + I * I)れ、最後の行を評価すると false が返されることがわかりました。

true が見つかったときに終了したいので、最後の評価を実行したくありません。

4

1 に答える 1

2

ダニエルのコメントは、おそらく問題を解決するための最も賢明な方法を示しています。他のオプション...

最新のコンパイラには、if/then/else コンストラクトがあります。

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)
    ).
于 2013-07-10T07:24:57.490 に答える