RSolver

今回は以前 http://d.hatena.ne.jp/ehito/20110526/1306382983 少し述べた numeric QE プログラム,RSolver http://rsolver.sourceforge.net/ について書きます.

一般に QE とは,与えられた論理式と等価で,量化子を含まない論理式を得る処理のことですが,今のところ作動原理から,扱えるのは代数関数に限られます.これに対して numeric QE は,結果を論理式ではなく,論理式(及びその否定)が定める解集合の区間塊による近似に留める代わりに,初等超越関数まで扱えるようにしたもののことです.

では,いつものようにインストールスクリプトです(なお,現ヴァージョンは64bit専用です).

mkdir ~/CAS
cd ~/CAS
wget http://jaist.dl.sourceforge.net/project/rsolver/rsolver/rsolver_3.1.tar.gz
tar zxvf ./rsolver_3.1.tar.gz
cd ./rsolver
sudo ln -s ./rsolver /usr/local/bin/rsolver

実行ファイルは,rsolver 本体とそのGUIスクリプト rsolver-gui.sh ですが,後者はカレントのファイルを呼ぶのでインストール先に移動してから

cd ~/CAS/rsolver
./rsolver-gui.sh

とすることになります.起動すると

のように初期状態で既にサンプルが入力されていますので,そのまま Submit をクリックすれば

が現れます.この図は自由変数の空間の Domain で指定した部分であり,その緑色の部分は Constraint(論理式)が T となる範囲の部分集合,赤色の部分は F となる範囲の部分集合を表し,右の一覧からそれらを構成する box(区間の直積)が読み取れ,上に並んだボタンやマウスによる範囲指定で,描画範囲を狭くすると,Domain も変更されるので,改めて Submit をクリックすれば,より細かな情報が得られます.

ただし,Results ウインドウが落ちたり,プロセスが残ったりするので GUI はお勧めできません.また,図が現れるのは自由変数の個数が 0,1,2 のときだけです.

入力の書式は

[自由変数の列]
論理式;
[自由変数の閉区間の列]

であり,記号は

Quantifiers:
    FORALL, EXISTS 
Connectives:
    \/, /\, ==> 
Predicates:
    <, <=, >, >= 
Function Symbols:
    *, +, SIN, COS, EXP, ASIN, ACOS, ATAN, LOG 
Constants:
    floating point numbers, PI, E 
Variables:
    lowercase alphanumeric strings starting with a letter

例えば,接線の掃引範囲は

[x,y]
EXISTS[s][[0,2]] [y=EXP(s)*(x-s+1)];
[[-2.0,4.0],[-1.0,5.0]]

といった具合です.例は,/examples 以下にあります.

なお,rsolver 本体をそのまま起動すると対話形式になってしまうので

cat 入力ファイル名 | rsolver

または

echo -e "入力ファイルの中身" | rsolver

とするのが簡便です.rsolver -h で表示されるオプションのうち

結果を逐次表示させる -i

volume(長さ,面積,体積,…)が X の区間まで計算させる -e X

は基本かと思います.

以下は,指定した集合に含まれる円板の半径の長さの条件です.

echo "[r]
EXISTS[a,b][[0,1],[0,1]]
FORALL[x,y][[0,1],[0,1]]
[(x-a)^2+(y-b)^2<r^2 ==> [0<y /\ y<COS(0.5*PI*x) /\ 0<x /\ x<1]];
[[0.34,0.36]]" | rsolver -i -e 0.001

==================================================================
                         RSolver 3.1
                              by
                        Stefan Ratschan
                   Czech Academy of Sciences
with
  Peter Franek, Tomas Dzetkulic, Sven Buente, Varadarajulu Reddy Pyda

includes:
  smathlib by Timothy Hickey and David Wittenberg
==================================================================
Variables (not quantified): Constraint: Box: F: r in [ 0.3575, 0.36]

F: r in [ 0.355, 0.3575]

F: r in [ 0.354350024644, 0.355]

F: r in [ 0.353425012322, 0.354350024644]

F: r in [ 0.35125, 0.3525]

T: r in [ 0.34, 0.34125]

T: r in [ 0.34125, 0.3425]

T: r in [ 0.3425, 0.34375]

F: r in [ 0.3525, 0.353425012322]

F: r in [ 0.350625, 0.35125]

F: r in [ 0.35, 0.350625]

F: r in [ 0.349375, 0.35]

T: r in [ 0.34375, 0.344375]

T: r in [ 0.345, 0.345625]

T: r in [ 0.345625, 0.34625]

T: r in [ 0.344375, 0.345]

F: r in [ 0.349281875456, 0.349375]

F: r in [ 0.348125, 0.34875]

F: r in [ 0.34875, 0.349281875456]

F: r in [ 0.3478125, 0.348125]

F: r in [ 0.3475, 0.3478125]

T: r in [ 0.34625, 0.3465625]

T: r in [ 0.3465625, 0.346875]

F: r in [ 0.347484565845, 0.3475]

T: r in [ 0.346875, 0.34703125]

T: r in [ 0.34703125, 0.347109375]

F: r in [ 0.34734375, 0.347484565845]

T: r in [ 0.347109375, 0.347155693225]

F: r in [ 0.347331139078, 0.34734375]

F: r in [ 0.347316199373, 0.347331139078]

F: r in [ 0.347265625, 0.347316199373]

F: r in [ 0.347251849686, 0.347265625]

F: r in [ 0.3472265625, 0.347251849686]

T: r in [ 0.3471875, 0.34720703125]

T: r in [ 0.347171596612, 0.3471875]

T: r in [ 0.347155693225, 0.347171596612]


True, volume ~[ 0.00720703125, 0.00720703125]
r in [ 0.347155693225, 0.347171596612]

r in [ 0.347171596612, 0.3471875]

r in [ 0.3471875, 0.34720703125]

r in [ 0.347109375, 0.347155693225]

r in [ 0.34703125, 0.347109375]

r in [ 0.346875, 0.34703125]

r in [ 0.3465625, 0.346875]

r in [ 0.34625, 0.3465625]

r in [ 0.344375, 0.345]

r in [ 0.345625, 0.34625]

r in [ 0.345, 0.345625]

r in [ 0.34375, 0.344375]

r in [ 0.3425, 0.34375]

r in [ 0.34125, 0.3425]

r in [ 0.34, 0.34125]


False, volume ~[ 0.0127734375, 0.0127734375]
r in [ 0.3472265625, 0.347251849686]

r in [ 0.347251849686, 0.347265625]

r in [ 0.347265625, 0.347316199373]

r in [ 0.347316199373, 0.347331139078]

r in [ 0.347331139078, 0.34734375]

r in [ 0.34734375, 0.347484565845]

r in [ 0.347484565845, 0.3475]

r in [ 0.3475, 0.3478125]

r in [ 0.3478125, 0.348125]

r in [ 0.34875, 0.349281875456]

r in [ 0.348125, 0.34875]

r in [ 0.349281875456, 0.349375]

r in [ 0.349375, 0.35]

r in [ 0.35, 0.350625]

r in [ 0.350625, 0.35125]

r in [ 0.3525, 0.353425012322]

r in [ 0.35125, 0.3525]

r in [ 0.353425012322, 0.354350024644]

r in [ 0.354350024644, 0.355]

r in [ 0.355, 0.3575]

r in [ 0.3575, 0.36]


Unknown:
r in [ 0.34720703125, 0.347216796875]

r in [ 0.347216796875, 0.3472265625]

これにより,上限は [ 0.34720703125, 0.3472265625] に属することが解ります.