数字。数字很容易。您需要了解的所有内容就是
...或两者兼有,但如果6≤6和6≤6,则6 = 6。
总阶(也称为线性阶)是集合S上的关系“≤”。对于a,b,c∈S,这三个属性成立。
利用为≤建立的规则,我们还可以告诉< b或> b或a = b对于每个a和b。
实数是可比的。这意味着您可以对它们进行排序。当然,不仅数字是可比的。名称是可比较的,并且可以按字母顺序排序。摩天大楼具有可比性,可以按高度排序。很多事情都是可比的和可排序的。
但是有些事情不是。像间隔一样,我们用来表示有错误的数字。当我们不知道确切的数x但知道它的误差ε时,便使用它们,因此有所有理由相信它卡在x 1和x 2之间,其中
当我们要测量某些计算的计算误差或查看某种算法是否足够稳定时,这些间隔非常有用。它们不是可比的或真正可排序的。
考虑两个重叠的间隔。假设[3,6]和[5,8]。我们知道,拳头间隔实际上是3到6之间的数字。第二个是5到8之间的另一个数字。从直觉上讲,后者应该大于前者。但是如果它是5而前者是6怎么办?然后显然更少了。他们甚至有机会平等。
因此存在某种顺序,例如[6,8]绝对大于[3,5]。但是此顺序并不适用于所有可能的间隔对。
这使事情变得不愉快。至少,现在我们不能使用二进制逻辑,因为所有比较现在都返回三种状态。例如a≤b现在可以为true,false或以上都不是。
因此,这意味着现在必须重新设计常规的if ... else语句。以及所有使用它的算法。
如果我们同意将谓词的语义“拆分”为两个,就不必完全放弃二进制逻辑。对于两个间隔上的每个谓词,我们仍然可以说它们所代表的数字确实足以满足该谓词,或者它们是否可以满足要求。
例如,[3,5]绝对小于[6,8],[3,6]可能小于[5,8]。对于我们来说,最不愉快的情况是间隔重叠。一切都是不确定的,然后一切皆有可能。
不过,其他所有方法都可以。在其语义内。但是,逻辑背后的代数还不是布尔值。现在¬(a< b)&nequiv a≥b。从技术上讲,可以使用相同的构建块来构建计算算法,就好像间隔是数字一样,仅此而已。
说到建筑的东西。让我们谈谈编程。用C ++或Python编程非布尔间隔逻辑非常容易。您必须重新实现间隔类型的每个谓词,并且您很高兴!
struct Interval {Number lb; //下限数字ub; //上限} //特定于间隔的谓词。bool巧合(const Interval&l,const Interval&r){return l.lb == r.lb&amp; l.ub == r.ub;}布尔交叉(const Interval&l,const Interval&r){return(l.ub&gt; = r.lb&amp;&l.lb&lt; = r.ub)| | (r.ub&gt; = l.lb&amp; r.lb&lt; = l.ub);} //定界&#34;间隔逻辑。//该关系对于l和r.bool中的每个数字都应保持不变。==(const Interval&l,const Interval&r)符合(l,r);}布尔运算符&lt;(const Interval&l; const Interval&amp; r){return l.ub&lt; r.lb;}布尔运算符&gt;(const Interval&l,const Interval&amp; r){return r&lt; l;} bool operator <=(const Interval&amp; l,const Interval&amp; r){return l.lb&lt; r.ub&amp;&amp; l.ub == r.lb;}布尔运算符&gt; =(const Interval&l,const Interval&amp; r){return r&lt; = l;} bool运算符!返回r&lt; l || l < r;}
没人关心谓词之间是布尔型的关系。它们只是一些任意函数,因此使用它们,您可以轻松定义“确定”逻辑或“可能”逻辑。如果为不同但可互换的类型定义它们,则可以同时具有两者。有点冗长但可行。
Rust在很大程度上依赖于订单的概念中变得有些棘手。
通常使用std :: cmp :: Ord特性引入自定义类型的比较运算符。它要求:
∀a,b:(a&lt; b)⊕(a = b)⊕(a&gt; b)a≤b∧b≤c⇒a≤c。
对于每个a和b,第一个读为,只有一个为真:(a&lt; b)或(a = b)或(a&gt; b)。这对我们不起作用。当间隔相交时,在“确定”逻辑中,所有谓词都不成立。按照“可能”的逻辑,它们都是。
幸运的是,还有另一个更为宽松的特征,它代表的不是总顺序,而是部分顺序:std :: cmp :: PartialOrd。 只需要不对称