(私は、主にswi-prologとyapを介して GMP ライブラリを間接的に使用しているにすぎません。しかし、この問題の修正に非常に関心があります。)
とてつもなく大きな値で累乗を実行すると、ホストシステムまたは GMP はオーバーフローを適切に処理できなくなります。上記のシステムの開発者と話をしましたが、彼らはこれを簡単に解決できるとは考えていません。
この問題は、他の GMP システム/ユーザーに知られていますか? このようなオーバーフローをどのように処理しますか?
サニティチェックとして、最初に 7^7^7 の値をテストします: 375982...32343
たとえば、32 ビット システムでは、クエリ?- X is 13^1150000000.
でこのようなオーバーフローが発生します。YAPが提供するものは次のとおりです。
GNU gdb (GDB) 7.0-ubuntu Copyright (C) 2009 Free Software Foundation, Inc. ライセンス GPLv3+: GNU GPL バージョン 3 以降 これはフリー ソフトウェアです。自由に変更して再配布してください。 法律で許可されている範囲で、保証はありません。「コピーを表示」と入力します 詳細については、「保証を表示する」を参照してください。 この GDB は「i486-linux-gnu」として構成されました。 バグ報告の手順については、次を参照してください。 ... /opt/gupu/src/yap-6.3/narch-gupu2/yap からのシンボルの読み込み...完了。 (gdb) 実行 -f プログラムの開始: /opt/gupu/src/yap-6.3/narch-gupu2/yap -f YAP 6.3.2 (i686-linux): 2012 年 11 月 11 日 04:19:37 CET ?- X は 13^1150000000 です。 プログラム受信信号 SIGSEGV、セグメンテーション違反。 0x001638d8 in ?? () /usr/lib/libgmp.so.3 から (gdb) ところで #0 0x001638d8 in ?? () /usr/lib/libgmp.so.3 から #1 /usr/lib/libgmp.so.3 からの __gmpn_mul_fft () の 0x00164470 #2 /usr/lib/libgmp.so.3 からの __gmpn_mul_fft_full () 内の 0x001646c2 #3 /usr/lib/libgmp.so.3 からの __gmpn_sqr_n () 内の 0x00165f28 #4 /usr/lib/libgmp.so.3 からの __gmpz_n_pow_ui () の 0x0014b58b #5 /usr/lib/libgmp.so.3 からの __gmpz_pow_ui () 内の 0x0014c4a1 #6 ../C/gmp_support.c:939 の Yap_gmp_exp_int_int (i1=13、i2=1150000000) の 0x080c4a1d #7 0x0815f9df in p_exp (t1=, t2=3082051592) at ../C/arith2.c:609 ../C/eval.c:147 の評価 (t=0) で #8 0x080b1f19 #9 p_is () の 0x080b2251 at ../C/eval.c:186 #10 ../C/absmi.c:6912 の Yap_absmi (inp=0) の 0x0806b56a #11 ../C/exec.c:1002 の exec_absmi (top=) の 0x080b3655 #12 0x080b3b1f in do_goal (t=, CodeAdr=, アリティ=, pt=0x0、top=1) ../C/exec.c:1068 #13 Yap_RunTopGoal の 0x080b3d1d (t=135918154) ../C/exec.c:1291 #14 0x08061a6f in YAP_RunGoalOnce (t=135918154) at ../C/c_interface.c:2511 #15 do_top_goal の 0x0805c2f5 (argc=2, argv=0xbffff4c4) at ../console/yap.c:84 #16 exec_top_level (argc=2, argv=0xbffff4c4) at ../console/yap.c:131 #17 メイン (argc=2, argv=0xbffff4c4) at ../console/yap.c:172 (gdb)
編集:これは 64 ビット システムにも当てはまります。そのようです:
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 6.3.5)
Copyright (c) 1990-2012 University of Amsterdam, VU Amsterdam
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions.
Please visit http://www.swi-prolog.org for details.
For help, use ?- help(Topic). or ?- apropos(Word).
?- X is 3445^2^62.
gmp: overflow in mpz type
Abort
でも、
?- X is 2^2^63.
ERROR: Out of global stack
?- X is 2^2^62.
gmp: overflow in mpz type
Abort
そして下から:
?- X is 2^2^36.
ERROR: Out of global stack
?- X is 2^2^37.
gmp: overflow in mpz type
Abort
そのため、数値が十分に大きい場合、エラーは SWI によって検出され、SWI によって処理されます (エラー: メッセージは SWI によるものです)。