/* 多N角形による円の面積の計算 */ /* 関数1 面積を収縮するまでNを大きくさせ、計算する */ /* converance_circle_area( 円の直径 ) */ /* 例 converance_circle_area( 2 ). */ /* 関数2 円に内接する正N角形を用いて円の面積を計算する */ /* inside_circle_area( 正N角形のN, 直径, 正N角形の円周に接する三角形の面積 ) */ /* 正N角形のN: input 2の階乗の整数 */ /* 例 inside_circle_area( 16, 2, Triangular_area ). */ /* 面積を収縮するまでNを大きくさせ、計算する */ converance_circle_area( Diameter ) :- /* fcreate( write_file, 'circle_area.txt', -1, 0, 0 ), output( write_file ), */ inside_circle_area( 4, Diameter, Triangular_area4 ), inside_circle_area( 8, Diameter, Triangular_area8 ), Area4 is Triangular_area4*4 / Diameter, Area8 is Triangular_area8*8 / Diameter, inside_area_limit( 16, Diameter, Area4, Area8 ). /* fclose( write_file ). */ /* 計算結果が収束するまで計算する */ inside_area_limit( _, _, Pre1, Pre2 ) :- Diff is Pre2 - Pre1, Diff < 0.0000000000000001, !. inside_area_limit( Polygon, Diameter, _, Pre ) :- inside_circle_area( Polygon, Diameter, Triangular_area ), Area is Triangular_area * Polygon, Polygon_next is Polygon * 2, inside_area_limit( Polygon_next, Diameter, Pre, Area ). /* 円に内接する正N角形を用いて円の面積を計算する */ /* inside_circle_area( 正N角形のN, 直径, 正N角形の円周に接する三角形の面積 ) */ /* 正N角形のN: input 2の階乗の整数 */ /* 例 inside_circle_area( 16, 2, Triangular_area ). */ inside_circle_area( Polygon, Diameter, Triangular_area ) :- /* 半径は直径 / 2 */ Radius is Diameter / 2, /* 正N角形のNの円に接する1辺の長さを計算する */ inside_area1( Polygon, Radius, Triangular_area ), /* 円周率Piは (円に接する1辺の長さ * 正N角形のN) / 直径 */ Circle_area is Triangular_area * Polygon, /* 計算結果出力 */ write( Polygon ), write( ' ' ), write( Circle_area ), nl. /* 円に接する三角形の面積を計算する */ /* inside_area1( 正N角形のN, 半径, 三角形の面積 ) */ /* 正4角形の場合の円に接する三角形の面積を計算 */ inside_area1( 4, Radius, Triangular_area ) :- !, /* 三角形の面積は 底辺 * 高さ / 2 */ /* 正4角形の場合は 半径*半径 / 2 */ Triangular_area is (Radius*Radius) / 2. /* 正N角形の場合の円に接する三角形面積を計算する */ inside_area1( Polygon_n, Radius, Triangular_area ) :- /* 正N/2角形の場合の円に接する1辺の長さを計算する */ Polygon_n1 is Polygon_n / 2, inside_line1( Polygon_n1, Radius, Hypotenuse_n1 ), /* 三角形の面積は 底辺 * 高さ / 2 */ Triangular_area is (Radius * Hypotenuse_n1 / 2) / 2. /* 円に接する1辺の長さを計算する */ /* inside_line1( 正N角形のN, 半径, 1辺の長さ ) */ /* 正4角形の場合の円に接する1辺の長さを計算する */ inside_line1( 4, Radius, Hypotenuse ) :- !, /* 三平方の定理より辺の長さを計算 */ Hypotenuse is sqrt( Radius*Radius + Radius*Radius ). /* 正N角形の場合の円に接する1辺の長さを計算する */ inside_line1( Polygon_n, Radius, Hypotenuse ) :- /* 正N/2角形の場合の円に接する1辺の長さを計算する */ Polygon_n1 is Polygon_n / 2, inside_line1( Polygon_n1, Radius, Hypotenuse_n1 ), /* L1は 正N/2角形の場合の円に接する1辺 / 2 */ L1 is Hypotenuse_n1 / 2, /* L2を三平方の定理より計算 */ L2 is Radius - sqrt( Radius*Radius - (Hypotenuse_n1 / 2)*(Hypotenuse_n1 / 2) ), /* L1とL2から三平方の定理より円に接する1辺の長さを計算 */ Hypotenuse is sqrt( L1*L1 + L2*L2 ).