2017-12-22 21 views
2

私は数式(Z3pyの定量化された式)ですべての変数を収集しようとしています。小さな例Z3定量化された式の変数の数を数えて

w, x, y, z = Bools('w x y z') 
fml = And(ForAll(x, ForAll(y, And(x, y))), ForAll(z, ForAll(w, And(z, w)))) 

varSet = traverse(fml) 

iが横断するために使用するコードは

def traverse(e): 
    r = set() 
    def collect(e): 
    if is_quantifier(e): 
     # Lets assume there is only one type of quantifier 
     if e.is_forall(): 
      collect(e.body()) 
    else: 
     if (is_and(e)): 
      n = e.num_args() 
      for i in range(n): 
       collect(e.arg(i)) 
     if (is_or(e)): 
      n = e.num_args() 
      for i in range(n): 
       collect(e.arg(i)) 
     if (is_not(e)): 
      collect(e.arg(0)) 
     if (is_var(e)): 
      r.add(e) 
    collect(e) 
    return r 

と私は取得してい:セット([ヴァー(0)、ヴァー(1)])を。これはZ3がDe Bruijn indexを使用しているためです。これを避けて、所望のセットを得ることができるか:セット([Var(0)、Var(1)、Var(2)、Var(3)])

答えて

1

コードは正しいです。この例ではVar(2)またはVar(3)はありません。 2つの最上位の量指定子があり、それぞれのde-Bruijnインデックスは0と1です。これらの2つの量子は、別の量指定子の本体内には現れないので、混乱することはありません。

+0

ありがとう、私はQBFの数式を量子なしの式に変換しようとしているので、Var(2)Var(3)を0と1に置き換えた場合、非定量化バージョンは情報を失います。たとえば、上記の式の場合、非qbfバージョンは、And(And(Var(0)、Var(1))、And(Var(0)、Var(1)))です。 – Pushpa

+0

申し訳ありませんが、それはde-Bruijnインデックスがどのように機能するかです。数式が変更されている場合は、インデックスを調整する必要があります(Z3では多くの場所で調整が行われます)。同じ変数名を使用する部分式を考えてみましょう。名前の変更も必要です。 –

+0

ありがとう、私はそれを理解している、私はそこに出る方法がありますか?あなたのコメントはNo. – Pushpa

関連する問題