我希望就如何实现这一点提出建议:
定义:无向图 G 由顶点集 V 和边集 E 定义,其中每条边是大小为 2 的 V 的子集,即无序顶点对 {u, v}。G中长度为k的循环是不同顶点的序列v_1,...,v_k,其中{v_1,v_2},{v_2,v_3},...,{v_k-1,v_k},{v_k,v_1 } 是 G 的所有边。G 中的哈密顿循环是长度为 n = |V| 的循环,即恰好通过图的每个顶点一次的 chcle。如果 G 有一个哈密顿循环,我们称它为 G 哈密顿量。
问题:提供以下决策问题的命题逻辑公式:给定一个无向图 G,G 是哈密顿量吗?配方将由 Z3 检查。
输入格式将是:
4
0 1
1 2
2 3
3 0
1 3
其中第一个数字表示顶点的数量,其余的对都是 G 中的边。
输出应该是:0 1 2 3
显然,输出将始终是数字 1、...、n-1 的某种排列,其中 n = |V| 但我看不到如何仅使用命题逻辑来处理整数。
任何建议表示赞赏。
问候。
这是适用于给定输入的解决方案。如果我可以编写一个 perl 例程来生成边的组合(n 选择 k),那么我可以将其推广到任意数量的输入:
(declare-const v0 Bool)
(declare-const v1 Bool)
(declare-const v2 Bool)
(declare-const v3 Bool)
(declare-const e1 Bool)
(declare-const e2 Bool)
(declare-const e3 Bool)
(declare-const e4 Bool)
(declare-const e5 Bool)
(assert (xor (and e1 e2 e3 e4) (and e1 e2 e3 e5) (and e1 e2 e4 e5) (and e1 e3 e4 e5) (and e2 e3 e4 e5)))
(assert (and v0 v1 v2 v3))
(assert (=> e1 (and v0 v1)))
(assert (=> e2 (and v1 v2)))
(assert (=> e3 (and v2 v3)))
(assert (=> e4 (and v3 v0)))
(assert (=> e5 (and v1 v3)))
(check-sat)
(get-model)