我有一个不等式系统,但问题是系统中的所有术语都是未分配的变量(编辑:所有变量都代表自然数)。就像我想给系统规则一样:
a + b >= f + h
f + b >= d + e
d + b >= a + c
然后询问系统是否有像
这样的查询 d + e >= f + g
必须是真的。有谁知道如何在matlab或python甚至prolog中做到这一点?
答案 0 :(得分:1)
正如您已经澄清的那样,您正在推理自然数。
您展示的特定案例是预算算术的示例,它是算术的可判定片段。有一些定理证明可用于Presburger算法,用Prolog和其他语言编写。
使用这样的证明,你可以举例说明前三个要求的第四个等式不:
?- valid(a + b >= f + h /\ f + b >= d + e /\ d + b >= a + c ==> d + e >= f + g). false.
这是一个明确的反例:
?- solution(a + b >= f + h /\ f + b >= d + e /\ d + b >= a + c /\ not(d + e >= f + g)). a=0. b=0. f=0. h=0. d=0. e=0. c=0. g=1.
或者,使用Prolog,您可以使用约束逻辑编程,分别使用整数或有理数,缩写为clpfd和clpq ,搜索反例。
例如,在您展示并使用CLP(Q)的情况下:
?- { A + B >= F + H, F + B >= D + E, D + B >= A + C, D + E < F + G }. {_1692>0, ...}.
这个答案显示(因为CLP(Q)是完成),反例存在于 Q ,但没有告诉我们该公式是否包含在整数或自然数。但是,如果这个查询失败了,那么我们就会知道Q 上没有反例,因此不会超过N,这意味着最后的不等式确实会超过N.
要使用约束逻辑编程搜索N上的反例,甚至整数,您可以使用 CLP(FD)。例如,您可以发布反例必须满足的约束:
?- A + B #>= F + H #/\ F + B #>= D + E #/\ D + B #>= A + C #/\ #\ (D + E #>= F + G),
您可以通过标签搜索具体解决方案。但是,这要求所有域都是有限。我们可以从0..2
开始,尝试越来越大的域名。这个策略完成:如果有一个反例,我们将以这种方式找到它。另一方面,如果不存在反例,请考虑我们无法从我们尚未找到的公式中得出关于公式有效性的任何结论。
在这种情况下,我们很幸运,很快就会找到几个反例:
?- A + B #>= F + H #/\ F + B #>= D + E #/\ D + B #>= A + C #/\ #\ (D + E #>= F + G), Vs = [A,B,C,D,E,F,G,H], Vs ins 0..2, label(Vs). A = B, B = F, F = H, H = D, D = E, E = C, C = 0, G = 1, Vs = [0, 0, 0, 0, 0, 0, 1, 0] ; A = B, B = F, F = H, H = D, D = E, E = C, C = 0, G = 2, Vs = [0, 0, 0, 0, 0, 0, 2, 0] ; A = F, F = H, H = D, D = E, E = C, C = 0, B = G, G = 1, Vs = [0, 1, 0, 0, 0, 0, 1, 0] ; A = F, F = D, D = E, E = C, C = 0, B = H, H = G, G = 1, Vs = [0, 1, 0, 0, 0, 0, 1, 1] ; A = F, F = H, H = D, D = E, E = C, C = 0, B = 1, G = 2, Vs = [0, 1, 0, 0, 0, 0, 2, 0] .
总之,我建议结合使用:
找到这种蕴涵的反例或证明。
请注意,这通常很快变为不可判定,但它比线性公式更具决定性。