给定一组条件,通过算法确定只有一个可以为True

时间:2010-08-20 15:09:19

标签: algorithm language-agnostic validation logic conditional-statements

给定一组两个或更多逻辑条件,是否可以通过算法确定其中一个将评估为TRUE?例如:

# this should pass, since for every X, only one condition is taken
cond 1: (X >= 1.0) 
cond 2: (X < 1.0)

# this should fail
cond 1: (X < 1.0)
cond 2: (X > 2.0)

# this should also fail, since X=1.0 would meet both conditions
cond 1: (X < 2.0)
cond 2: (X > 0.0)

# there may be more than one variable involved
cond 1: (X >= 1.0 && Y >= 0)
cond 2: (X < 1.0 && Y <= -1)

这些条件是从域特定语言生成的,用于确定下一个执行路径。即,当执行树分成多个路径时,用户为每个选项组成条件,并且评估为真的条件确定要采用的路径。为了使模拟有效,这些应该只是可以为任何给定值采用的一种可能路径。

目前,我会在运行时评估这些条件,如果多于一个(或没有)是真的,就会发脾气。

我希望能够在解析阶段检查错误的条件(域语言到可编译的源代码)。可能吗?如何验证条件?

更新

关于条件中可包括的内容,范围在实践中相当广泛。所有这些都是可能的条件:

  • X >= Y && Y < Z
  • X.within_radius(0.4)
  • X IN some_array
  • X * Y < Z

最后更新

似乎无法涵盖所有​​可能条件的解决方案(或者至少,鉴于我的知识有限,在分配给问题的时间内不可能)。将来有一天会再次访问,但现在接受的回答让我向前走了最远。

4 个答案:

答案 0 :(得分:3)

编辑:我会重申,因为看起来其他答案似乎已经确认了一系列已被证实的事情:

如果您可以根据Presburger arithmetic说明您的条件(以及只有一个条件的约束条件),那么您可以编写一个决策程序来静态验证该属性。从上面的例子来看,这似乎是完全可以实现的。

“钝器”方法基本上是与自动定理证明器或SMT求解器等接口(你基本上试图证明对语句的否定“存在满足约束1 XOR约束2的某些值x” )。我之前以编程方式与CVC3接口,并且发现它非常适合使用,但我的理解是它已被其他SMT求解器超越。

我认为,你为解决这个问题所做的任何其他事情可能最终会接近我建议的各种工具的实现。根据您的约束的确切方式,您可能能够为Presburger arithmetic之类的内容实施某种决策程序。

答案 1 :(得分:1)

一般来说,没有。但是,如果您真正要问的是,是否有可能在一组有限的独立整数变量的不等式的布尔逻辑组合上给出条件,那么就有希望。您可以通过使用出现在不等式中的常量(以及这些常量的+1和-1)来置换变量,并验证保持为真的条件数始终为1来详尽检查。

答案 2 :(得分:1)

如果您想查找是否只有一个条件是真的(在两个或更多可能的条件中),在SO:xor-of-three-values上引用这个xor问题可能会有所帮助。 直接回答:

(a ^ b ^ c) && !(a && b && c)

在你的情况下:

(cond 1 ^ cond 2 ^ cond 3) && !(cond 1 && cond 2 && cond 3)

还有一个通用的解决方案,每当条件为真时递增计数,然后在测试完所有条件后检查计数。

答案 3 :(得分:0)

你的构建块是否只是

  • 一个整数变量,
  • 比较运算符(&lt;,&lt; =,&gt;,&gt; =),
  • 数字(让我们假设整数)?

最终条件是使用&amp;&amp;和和||?

我们可以假设所有整数变量都是独立的吗?

在这些条件下,我认为可以通过算法进行检查。我会将每个变量的所有有效范围放入数据结构中,并检查交叉点。

编辑:由于情况似乎并非如此,最佳解决方案可能是对不同类型的条件进行分组,以便可以相互静态评估每个组中的条件。我从你的第一个描述中假设的条件类型只是这些组中的一个。