広域システム概論I「パズルをソルバーで解く」

担当 田中哲朗


このページは2017/11/8(水)2限の広域システム概論Iで田中が担当した 「パズルをソルバーで解く」のサポートページです.

スライド


リンク


サンプルプログラム


z3を用いた3人の賢者問題の求解

数学セミナー「エレガントな解答をもとむ」で出題者の用意した解答の間違いの発見 z3を用いた3人の賢者問題の求解

他の問題

数学セミナー2017年9月号の「エレガントな解答をもとむ」でピーター・フランクルさんによる以下の問題が出された.

1+5+6=12と2+3+7=12は,同じ数(12)を,全く異なる3つずつの整数の和として表す式の組合せです.左辺に登場する整数 1,5,6,2,3,7には重複がありません.
右辺の数を42にして,同様な式いくつかの組合せ

a + b + c = 42
d + c + f = 42
g + h + i = 42
...
を作ります.式の個数がなるべく多い組合せを作ってください! 左辺には同じ数は二回以上登場できません.

この問題はz3を使って「エレガント」ではなく力任せで解ける.


z3を教育用計算機システム(ECCS)のMac環境で使う

ECCSのMac環境にはz3は入っていません. 以下では,ECCS標準のpython環境は全く使わずに,個人のホームディレクトリに のすべてをインストールする方法を示します(ディスクの空き容量が 3GB 程度は必要です). コマンドラインだけであれば,sshサーバで使う(およびインストール作業をおこなう)こともできます.

仮想環境の作成

まずは,pyenvを ~/.pyenv 以下にインストールします.それまでに,pyenvを使ったことのある人は,
mv ~/.pyenv ~/.pyenv.old
などとして退避しておいてください. Qiita(pyenv + anaconda + python3)に従って(anacondaのバージョンだけは変更して),
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc
pyenv install -l | grep ana #最新のパッケージを検索
pyenv install anaconda3-5.0.1
pyenv rehash
pyenv global anaconda3-5.0.1
echo 'export PATH="$PYENV_ROOT/versions/anaconda3-5.0.1/bin/:$PATH"' >> ~/.bashrc
source ~/.bashrc
conda update conda
を実行してください(時間はかなりかかります).~/.bash_profileに以下の行がなかったら,以下の行を足します.
. ~/.bashrc
Qiita(pyenv + anaconda + python3)では,pyenv本来の使い方として仮想環境を作成していますが,以下ではbaseにインストールします.

z3のインストール

conda でインストールできるバージョンは少し古いので,ソースから最新版をコンパイルします.まずは,ソースを ~/work/z3 に展開します.
mkdir ~/work
cd ~/work
git clone https://github.com/Z3Prover/z3.git
その後で,buildのための準備をします.以下の「自分のユーザ名」はECCSでのユーザ名(普通は10桁の数字)に置き換えて実行します.
cd ~/work/z3
python scripts/mk_make.py --python --prefix=/home/「自分のユーザ名」/.pyenv/versions/anaconda3-5.0.1
ビルドを実行します.これはしばらく時間がかかります.
cd ~/work/z3/build
make
インストール
make install
を実行すると ~/.pyenv/versions/anaconda3-5.0.1 以下にz3関係のファイルが作られます.

z3の利用

ターミナルで,
python
として起動すると,z3が使える環境でpython3が立ち上がります.
Python 3.6.3 |Anaconda, Inc.| (default, Oct  6 2017, 12:04:38) 
[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from z3 import *
>>> x, y = Ints("x y")
>>> solve(x > 0, y > 0, x + y < 3, x + 2 * y < 5)
[y = 1, x = 1]
同じターミナルで,
jupyter-notebook
を実行すると,ブラウザ上でz3が使える状態で python3 を操作できます.