我试图自动证明/反驳几何中与方块相关的一些定理,例如“对于7个不相交的正方形的每3个集合,可以从每个集合中选择1个正方形,使得3个代表是内部不相交的?”。
我尝试使用OpenGeoProver并提出以下对方块的描述:
<!-- define a 'free' point - the south-western corner of the square: -->
<pfree label="square1southwest"/>
<!-- define a line that is parallel to the x axis and goes throught that point - the southern boundary: -->
<lparallel label="square1south" point="square1southwest" baseline="xaxis" />
<!-- define a random point on the southern line, which will be the south-eastern corner: -->
<prandline label="square1southeast" line="square1south" />
<!-- rotate the south-eastern corner 90 degrees around the south-western corner, to create the north-western corner: -->
<protated label="square1northwest" origpt="square1southeast" center="square1southwest" angmeasure="-90"/>
<!-- translate the north-western corner by the vector between the two southern corners, to create the north-eastern corner of the square: -->
<ptranslated label="square1northeast" origpt="square1northwest" point1="square1southwest" point2="square1southeast"/>
这就是我被困的地方:如何定义简单的语句“square A和square B intersect”?
如何在Z3中解决此问题?
答案 0 :(得分:2)
我试图用MiniZinc反驳你的定理:
int: noOfCollections = 3;
int: noOfDisjoints = 7;
int: noOfSquares = noOfCollections * noOfDisjoints;
set of int: Squares = 1..noOfSquares;
int: maxDim = 10000; % somewhat arbitrary limit!
int: maxLeft = maxDim;
int: maxRight = maxDim;
int: maxTop = maxDim;
int: maxBottom = maxDim;
int: maxHeight = maxBottom - 1;
int: maxWidth = maxRight - 1;
array[Squares] of var 1..maxLeft: Left;
array[Squares] of var 1..maxTop: Top;
array[Squares] of var 1..maxHeight: Height;
array[Squares] of var 1..maxWidth: Width;
array[Squares] of var bool: Representative;
array[Squares] of 1..noOfCollections:
Collection = [1 + (s mod noOfCollections) | s in Squares];
% Squares must fit in the overall frame
constraint
forall(s in Squares)(
(Left[s] + Width[s] - 1 <= maxRight) /\
(Top[s] + Height[s] - 1 <= maxBottom)
);
predicate disjoint(var int: s1, var int: s2) =
(Left[s1] + Width[s1] - 1 < Left[s2]) \/
(Left[s2] + Width[s2] - 1 < Left[s1]) \/
(Top[s1] + Height[s1] - 1 < Top[s2]) \/
(Top[s2] + Height[s2] - 1 < Top[s1]);
% Squares in a collection must be disjoint
constraint
forall(s1 in Squares, s2 in Squares
where (s1 > s2) /\ (Collection[s1] == Collection[s2]))(
disjoint(s1, s2)
);
% Exactly one Representative per Collection
constraint
1 == sum(c in 1..noOfCollections, s in Squares
where c == 1 + (s mod noOfCollections))
(bool2int(Representative[s]));
% Is it possible to select 1 square from each collection such
% that the 3 representatives are interior disjoint?
constraint
forall(s1 in Squares, s2 in Squares, s3 in Squares
where (Collection[s1] == 1) /\
(Collection[s2] == 2) /\
(Collection[s3] == 3))(
disjoint(s1, s2) /\
disjoint(s1, s3) /\
disjoint(s2, s3) /\
Representative[s1] /\
Representative[s2] /\
Representative[s3]
);
solve satisfy;
MiniZinc在45ms后推出“UNSAT”。
答案 1 :(得分:0)
我会这样做(不会使用任何语言或框架,因为它不相关):
1.dataset定义
2.dataset generation
但由于时间和空间的复杂性,这真的很讨厌
这是困难的部分
3.定理陈述
你的陈述“方形A和方形B相交”
有问题把B - 起点放在A里面(随机或中间或其他)
另一个选项是仅选择与数据集相交的正方形