1. 简介

谓词问一个问题,答案是真还是假,或者换句话说,是或否。

在计算机科学和数学中,这个问题以函数的形式出现。函数的结果为真或假(是或否)。答案的数据类型,同样在数学和计算机科学中都称为布尔值。

在本教程中,我们将通过一些示例更深入地介绍这些概念。

2. 简单定义

谓词是一组参数的函数,该参数返回布尔值作为答案:

boolean predicate(set of parameters)Copy

布尔值的值为 true 或 false(是或否)。函数的输入可以是我们想要的任何一组参数。

例如,如果我们有一个数字问题,例如“温度是否大于 25”,我们可以这样写:

temperature > 25Copy

答案要么为真,例如,如果温度为30,要么为假,例如,如果温度为20。

如果我们在 Java 中将此谓词编写为函数,我们可以编写:

boolean checkTemperature(int temperature) {

return temperature > 25;

}Copy

3. 布尔值和布尔表达式

每种编程语言都有一个布尔数据类型,每种编程语言都有表达真、假和布尔运算集的方法。

我们可以在此表中看到一些示例:

 

语言数据类型真假示例表达式

C, C++,C#

bool

true

false

x>2 && y==5

Java

boolean

true

false

x>2 && y==5

Java类似语言

Boolean

TRUE

FALSE

x>2 && y==5

Python

True

False

(x>2) and (y==5)

Fortran

logical

.true.

.false.

(x.GT.2).AND.(y.EQ.5)

Algol

BOOLEAN

TRUE

FALSE

X GTR 2 AND Y EQL 5

3.1. 没有明确的布尔值

某些语言,如Perl,Tcl,LISP和SQL,没有显式布尔数据类型。这些语言虽然没有明确说明,但使用整数、字节甚至位作为布尔数据类型的基础。从本质上讲,零是假的,其他任何东西都是真的。

例如,在 C 语言中,bool数据类型来自 _BOOL数据类型。使用布尔被认为更加用户友好。

_BOOL数据类型基于无符号 int。假设我们分配X以具有数据类型_BOOL如以下代码所示:

_BOOL X;

X = 0 /* X gets assigned 0 */

X = 1 /* X gets assigned 1 */

X = 5 /* X gets assigned 1 */

X = "Hi" /* X gets assigned 1 */Copy

在这里,我们看到X在分配除零以外的任何值时假定值为 1。

4. 编程中的谓词

4.1. 命令式程序中的流量控制

每当我们必须在编程中做出决定时,我们都需要一个谓词。

在命令式编程语言中,例如常见的编程语言,如 C、Java、Python 和 Fortran,仅举几例,常见的决策语句是IF语句:如果一组条件为真,则做某事;否则,请执行其他操作。

例如,在Java中,我们可以编写:

if (x > 25) {

/* true: do something */

} else {

/* false: do something else */

}Copy

x>25是谓词。它是数值参数x的函数,给出一个布尔值,意思是真或假,作为答案。

作为函数编写,我们可以说(如这个 Java 示例):

boolean checkX(int x) {

return x > 25;

}

Copy

4.2. 谓词作为过滤器

谓词可以被视为对象的筛选器。使用谓词,我们可以过滤掉一组不满足谓词的对象。

例如,假设我们有一组要过滤的对象,命名对象。我们的过滤条件是函数的主体,谓词(对象)。如果谓词(对象)为真,我们希望将对象放在过滤集中;否则,我们忽略它。

伪代码可能如下所示:

但谓词并不总是必须使用数字。例如,我们可以过滤一组动物:

lion, elephant, parrot, whale, horse, eagle, cat, dog, human, robin, squirrelCopy

如果我们想创建一组鸟,那么我们将使用谓词:

isABird(animal) := true if animal is a birdCopy

最后一组将是:

parrot,eagle,robinCopy

我们如何实际编程将取决于我们对动物的表示。

例如,我们可以将每个动物表示为矩阵中的一组双精度值,动物描述。每一行都是不同的动物,每一列都是动物的特定属性:

0:ID

1:高度(米)

2:重量(克)

3:速度(米/秒)

4:有羽毛,0.0 表示否,1.0 表示是

5:能飞,0.0 表示否,1.0 表示是

6:腿数

7:下蛋,0.0 表示否,1.0 表示是

然后,也许我们将识别鸟的谓词表述为:

AnimalDescription(animal, 4) == 1Copy

当然,我们会问我们的生物学家朋友这是否足够。

4.3. 排序算法中的谓词

排序算法的关键是确定两个对象之间的关系。我们看到,无论采用何种排序方法,所有算法都必须确定对象之间的关系。谓词的作用是提供这种关系。

通常,我们必须确定一个对象是否“大于”另一个对象:

isGreaterThan(object1,object2) := true if object1 is greater than object2Copy

“大于”的定义将取决于对象以及我们希望如何查看它们。

例如,在我们前面的动物示例中,我们可以定义:

isGreaterThan(animal1,animal2) := true if animal1 weighs more than animal2Copy

这可以给我们一个从最大重量到最小重量的动物列表。

但是,如果我们希望动物从小到大列出呢?这可以通过以下方法轻松实现:

isGreaterThan(animal1,animal2) := true if animal weighs less than animal2Copy

也就是说,即使算法需要一个“isGreaterThan”谓词,我们也可以用任何我们想要的方式定义这个谓词,即使使用“小于”而不是“大于”。在前面给出的示例表示中,我们的谓词将是:

isGreaterThan(animal1,animal2) := AnimalDescription(animal1, 2) < AnimalDescription(animal2, 2)Copy

4.4. 排序和过滤中的面向对象谓词

在面向对象编程中,谓词可以封装到定义所需函数的类中,例如“isGreaterThan”。然后,排序或过滤算法不仅要处理要处理的对象集,还要具有具有谓词的类。

在 Java 中,我们首先使用以下函数定义一个抽象类:

class Predicate {

abstract boolean isGreaterThan(Object x1, Object x2);

}

Copy

然后,排序或过滤算法将在其定义中使用此抽象类来执行其功能。他们期望一个定义了isGreaterThan函数的类。

例如,我们可以定义一个具有函数 addToFilteredSet 的FilterObjects类,该函数将过滤后的对象添加到filteredset 中:

class FilterObjects {

void addToFilteredSet(Set setOfObjects,

Set filteredSet,

Predicate predicate) {

for(Object object: setOfObjects) {

if(predicate.isGreaterThan(object)) {

filteredSet.add(object);

}

}

}

}Copy

5. 模糊逻辑谓词

有时,当我们问一个是/否的问题时,答案并不是真的对或错。

也许我们不确定,或者介于两者之间。例如,如果我们提出问题或设置一个谓词来回答问题,使用温度:

问题:水热吗?

谓词:IsItHot(T)

如果水正在沸腾,温度T为100摄氏度,答案肯定是“是”。此外,如果水几乎结冰,例如 5 摄氏度,那么答案肯定是否定的。

但是,如果我们把水烧开,然后在雪地里让它降温,会发生什么?首先,水是热的,谓语的答案是正确的。但一个小时后,水肯定是冷的,对谓词的回答是假的。

但是,谓词的答案在什么温度下从真变成假?是40岁吗?30?25?例如,我们是否认为在 31 度时水是热的,然后在 30 度时突然水是冷的?我们知道水会冷却,一会儿变温,然后变冷。基本上,我们有一个“不确定哪个”的区域。

更复杂的是,来自挪威的斯文对“热”的印象可能与来自意大利的乔瓦尼不同。

这就是模糊逻辑发挥作用的地方。它提供了真假之间的渐进过渡。

5.1. 模糊逻辑谓词示例

在图中,我们定义了一个谓词IsItHot(T),它回答了“它热吗?”这个问题。这里,如果IsItHot(T)=1.0,答案是“是”,如果PIsItHot(T)=0.0,答案是“否”。

在正常的布尔(真/假)逻辑中,我们看到热与冷之间有一个急剧的转变。这与我们的直觉不符。但是,模糊逻辑谓词在冷热之间有一个缓慢的转换过程。答案越接近1.0,水越热,越接近0.0,水越冷。如果这个值是0.5,那么我们真的不确定。

6. 结语

在本教程中,我们已经看到了谓词作为返回布尔值的函数的定义。

此外,我们还看到了谓词概念在程序流、筛选和排序中的几种用途。简而言之,每当要提出问题或做出决定时,谓词的概念就会发挥作用。

我们还考虑了将布尔概念扩展到模糊逻辑。这就是我们认识到有时我们无法做出非黑即白的决定的地方。有时会有灰色地带。

好文链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。