多くのSMTソルバが対応するSMT2形式の記述方法を説明します。充足可能時の値の組み合わせを求める事が出来るソフトウェアです。この分野には先行してSATソルバというものがあり、こちらは全量演算子∀などが扱えないという条件があります。SMTソルバではこのような条件はなくほとんどすべての論理制約を解析可能であると同時に、ビット幅のある変数の宣言などを直接記述できるなど使い勝手が向上しています。個人的には、多様な変数名を設定できることはとても便利です。SATソルバは数十万変数から数百万変数の制約式が解析可能と言われていますが、SMTソルバは高機能故にそこまでのスケーラビリティを実現出来ていません。大きな問題を解く場合にはSATソルバをうまく活用する事を考える必要があるけれど、それほど大きな問題を解かないのであればSMTソルバの活用を考えるべきでしょう。このポストでは、今までSATソルバで記述できていたような制約式(CNF式、DIMACS形式など)を、SMT2式で書く方法について説明します。変数の宣言まずは変数の宣言を行います。1bit変数aは以下のようにして宣言します。必要な変数を宣言し終わったら、制約を追加することができます。a)は以下のように制約を記述します。2入力ANDの出力が1になるのは、両方の入力が1になる時です。「1になるかどうか」という命題は真ですので、その旨を出力させたいです。)これをSMTソルバに入力すると以下のように出力するはずです。今回はZ3というSMTソルバを使います。test1.stm2sat“sat”と表示されました。できれば、どのようなときに1になるかも出力させたいので、それもやってみます。SATの場合に値の割り当てを見たい場合には、get-valueを用います。以下のようになるはずです。)では、実行してみましょう。true))まだまだあるSMT2形式の言語仕様SMT2式の書き方についてはPDFにまとまっている言語仕様を参照すると良いでしょう。http://smtlib.cs.uiowa.edu/SMTソルバによってはPythonAPIなどを提供していることもあるので、それを利用して実装を簡単にすることもできます。