Heronian triangles: Difference between revisions

→‎{{header|Logtalk}}: Refactored the ordering code.
(→‎{{header|Logtalk}}: Used aliases to clean up some of the clutter in reading the test object.)
(→‎{{header|Logtalk}}: Refactored the ordering code.)
Line 3,092:
).
 
order_by_areaorder_by(_, =, T, T) :- !.
% order triangles by area first, falling back to sides when areas are equal
order_by_sidesorder_by(area, <, t(A1,_,_,_,Area1,_), t(A2,_,_,_,Area2,_)) :- A1 Area1 < A2Area2, !.
order_by_area(=, T, T) :- !.
order_by_areaorder_by(<area, >, t(_,_,_,Area1,_), t(_,_,_,Area2,_)) :- Area1 <> Area2, !.
order_by_areaorder_by(>perimeter, <, t(_,_,_,Area1,_,Perimeter1), t(_,_,_,Area2,_,Perimeter2)) :- Area1Perimeter1 >< Area2Perimeter2, !.
order_by_perimeterorder_by(perimeter, >, t(_,_,_,_,Perimeter1), t(_,_,_,_,Perimeter2)) :- Perimeter1 > Perimeter2, !.
order_by_area(O, T1, T2) :- order_by_sides(O, T1, T2).
order_by_sidesorder_by(_, <, t(A1,_,_,C1,_,_), t(_A2,_,C2_,_,_)) :- C1A1 < C2A2, !.
order_by_sidesorder_by(_, <, t(_,B1,_,_,_), t(_,B2,_,_,_)) :- B1 < B2, !.
order_by(_, <, t(_,_,C1,_,_), t(_,_,C2,_,_)) :- C1 < C2, !.
order_by_sidesorder_by(_, >, _, _).
 
% order triangles by perimeter first, falling back to sides when perimeters are equal
order_by_perimeter(=, T, T) :- !.
order_by_perimeter(<, t(_,_,_,_,Perimeter1), t(_,_,_,_,Perimeter2)) :- Perimeter1 < Perimeter2, !.
order_by_perimeter(>, t(_,_,_,_,Perimeter1), t(_,_,_,_,Perimeter2)) :- Perimeter1 > Perimeter2, !.
order_by_perimeter(O, T1, T2) :- order_by_sides(O, T1, T2).
 
% order triangles by side A, then B, then C
order_by_sides(<, t(A1,_,_,_,_), t(A2,_,_,_,_)) :- A1 < A2, !.
order_by_sides(<, t(_,B1,_,_,_), t(_,B2,_,_,_)) :- B1 < B2, !.
order_by_sides(<, t(_,_,C1,_,_), t(_,_,C2,_,_)) :- C1 < C2, !.
order_by_sides(>, _, _).
 
:- end_object.
:- end_object.
</syntaxhighlight>
34

edits