/* 多角形による円周率の計算 */ /* 関数1 Piを収縮するまでNを大きくさせ、計算する */ /* converance_pai( 円の直径 ) */ /* 例 converance_pai( 1 ). */ /* 関数2 円に内接する正N角形を用いて円周と円周率を計算する */ /* inside_pi( 正N角形のN, 直径, 正N角形の円周に接する1辺の長さ ) */ /* 正N角形のN: input 2の階乗の整数 */ /* 例 inside_pi( 16, 1, Hypotenuse ). */ /* Piを収縮するまでNを大きくさせ、計算する */ converance_pai( Diameter ) :- /* fcreate( write_file, 'pai.txt', -1, 0, 0 ), output( write_file ), */ inside_pi( 4, Diameter, Hypotenuse4 ), inside_pi( 8, Diameter, Hypotenuse8 ), Length4 is Hypotenuse4*4 / Diameter, Length8 is Hypotenuse8*8 / Diameter, inside_pi_limit( 16, Diameter, Length4, Length8 ). /* fclose( write_file ). */ /* 計算結果が収束するまで計算する */ inside_pi_limit( _, _, Pre1, Pre2 ) :- Diff is Pre2 - Pre1, Diff < 0.0000000000000001, !. inside_pi_limit( Polygon, Diameter, _, Pre ) :- inside_pi( Polygon, Diameter, Hypotenuse ), N2 is Hypotenuse * Polygon / Diameter, Polygon_next is Polygon * 2, inside_pi_limit( Polygon_next, Diameter, Pre, N2 ). /* 円に内接する正N角形を用いて円周と円周率を計算する */ /* inside_pi( 正N角形のN, 直径, 正N角形の円周に接する1辺の長さ ) */ /* 正N角形のN: input 2の階乗の整数 */ /* 例 inside_pi( 64, 1, Hypotenuse ). */ inside_pi( Polygon, Diameter, Hypotenuse ) :- /* 半径は直径 / 2 */ Radius is Diameter / 2, /* 正N角形のNの円に接する1辺の長さを計算する */ inside_line1( Polygon, Radius, Hypotenuse ), /* 円周率Piは (円に接する1辺の長さ * 正N角形のN) / 直径 */ Pi is Hypotenuse * Polygon / Diameter, /* 計算結果出力 */ write( Polygon ), write( ' ' ), write( Pi ), nl. /* 円に接する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 ).