是否有类似中电(FD)和x27的指导Z3方法;s ff标签?

是否有类似中电(FD)和x27的指导Z3方法;s ff标签?,z3,smt,clpfd,labeling,Z3,Smt,Clpfd,Labeling,这更多的是承认我在解决问题的研究中不识字,而不是与实际编程相关;查看以下Z3中N皇后的典型示例: print('Solving N Queens for a {} by {} chess board'.format(n, n)) # Instantiate solver s = Solver() # Creating row and column co-ordinates for each queen columns = [Int('col_%d' % i) for i in range(n)]

这更多的是承认我在解决问题的研究中不识字,而不是与实际编程相关;查看以下Z3中N皇后的典型示例:

print('Solving N Queens for a {} by {} chess board'.format(n, n))
# Instantiate solver
s = Solver()
# Creating row and column co-ordinates for each queen
columns = [Int('col_%d' % i) for i in range(n)]
rows = [Int('row_%d' % i) for i in range(n)]
# Should only be one queen per row or column
s.add(Distinct(rows))
s.add(Distinct(columns))

# Each cell should have a value within the boards co-ordinates
for i in range(n):
    s.add(columns[i] >= 0,columns[i] < n, rows[i] >= 0, rows[i] < n)
# No queens should be to take each other
for i in range(n - 1):
    for j in range(i + 1, n):
        s.add(abs(columns[i] - columns[j]) != abs(rows[i] - rows[j]))
s.check()
这很容易处理100个皇后。 显然,这种优化不能从字面上翻译成SMT。
因此,我的问题是:在这种情况下,指导解算器的惯用方法是什么?

像z3这样的通用SMT解算器永远无法与Prolog的SLD分辨率引擎的可伸缩性相匹配。另一方面,SMT解算器使用的策略更为通用:它们在理论组合和算术、数据结构、浮点等推理能力方面表现出色,所有这些都以混合匹配的方式出现。因此,基本的Prolog实现无法处理SMT解算器可以处理的一系列问题,至少不是现成的

我认为最好把这些系统看作是:PROlog在SLD分辨率可以找到解决方案的问题中闪耀,并且它可以伸缩。SMT解算器基本上可以模拟SLD搜索,但它不能像定制SLD引擎那样扩展,就像您在专用prolog实现中所发现的那样。最好是发挥各自的优势,而不是试图让一方模仿另一方

:- use_module(clpz).
n_queens(N, Qs) :-
        length(Qs, N),
        Qs ins 1..N,
        safe_queens(Qs).
safe_queens([]).
safe_queens([Q|Qs]) :- safe_queens(Qs, Q, 1), safe_queens(Qs).
safe_queens([], _, _).
safe_queens([Q|Qs], Q0, D0) :-
        Q0 #\= Q,
        abs(Q0 - Q) #\= D0,
        D1 #= D0 + 1,
        safe_queens(Qs, Q0, D1).
/* Example:
   ?- n_queens(100, Qs), labeling([ff], Qs). */