计算机科学中的谓词
1. 简介
谓词问一个问题,答案是真还是假,或者换句话说,是或否。
在计算机科学和数学中,这个问题以函数的形式出现。函数的结果为真或假(是或否)。答案的数据类型,同样在数学和计算机科学中都称为布尔值。
在本教程中,我们将通过一些示例更深入地介绍这些概念。
2. 简单定义
谓词是一组参数的函数,该参数返回布尔值作为答案:
代码语言:javascript代码运行次数:0运行复制boolean predicate(set of parameters)Copy
布尔值的值为 true 或 false(是或否)。函数的输入可以是我们想要的任何一组参数。
例如,如果我们有一个数字问题,例如“温度是否大于 25”,我们可以这样写:
代码语言:javascript代码运行次数:0运行复制temperature > 25Copy
答案要么为真,例如,如果温度为30,要么为假,例如,如果温度为20。
如果我们在 Java 中将此谓词编写为函数,我们可以编写:
代码语言:javascript代码运行次数:0运行复制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 | <class 'bool'> | 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如以下代码所示:
代码语言:javascript代码运行次数:0运行复制_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中,我们可以编写:
代码语言:javascript代码运行次数:0运行复制if (x > 25) {
/* true: do something */
} else {
/* false: do something else */
}Copy
x>25是谓词。它是数值参数x的函数,给出一个布尔值,意思是真或假,作为答案。
作为函数编写,我们可以说(如这个 Java 示例):
代码语言:javascript代码运行次数:0运行复制boolean checkX(int x) {
return x > 25;
}
Copy
4.2. 谓词作为过滤器
谓词可以被视为对象的筛选器。使用谓词,我们可以过滤掉一组不满足谓词的对象。
例如,假设我们有一组要过滤的对象,命名对象。我们的过滤条件是函数的主体,谓词(对象)。如果谓词(对象)为真,我们希望将对象放在过滤集中;否则,我们忽略它。
伪代码可能如下所示:
但谓词并不总是必须使用数字。例如,我们可以过滤一组动物:
代码语言:javascript代码运行次数:0运行复制lion, elephant, parrot, whale, horse, eagle, cat, dog, human, robin, squirrelCopy
如果我们想创建一组鸟,那么我们将使用谓词:
代码语言:javascript代码运行次数:0运行复制isABird(animal) := true if animal is a birdCopy
最后一组将是:
代码语言:javascript代码运行次数:0运行复制parrot,eagle,robinCopy
我们如何实际编程将取决于我们对动物的表示。
例如,我们可以将每个动物表示为矩阵中的一组双精度值,动物描述。每一行都是不同的动物,每一列都是动物的特定属性:
- 0:ID
- 1:高度(米)
- 2:重量(克)
- 3:速度(米/秒)
- 4:有羽毛,0.0 表示否,1.0 表示是
- 5:能飞,0.0 表示否,1.0 表示是
- 6:腿数
- 7:下蛋,0.0 表示否,1.0 表示是
然后,也许我们将识别鸟的谓词表述为:
代码语言:javascript代码运行次数:0运行复制AnimalDescription(animal, 4) == 1Copy
当然,我们会问我们的生物学家朋友这是否足够。
4.3. 排序算法中的谓词
排序算法的关键是确定两个对象之间的关系。我们看到,无论采用何种排序方法,所有算法都必须确定对象之间的关系。谓词的作用是提供这种关系。
通常,我们必须确定一个对象是否“大于”另一个对象:
代码语言:javascript代码运行次数:0运行复制isGreaterThan(object1,object2) := true if object1 is greater than object2Copy
“大于”的定义将取决于对象以及我们希望如何查看它们。
例如,在我们前面的动物示例中,我们可以定义:
代码语言:javascript代码运行次数:0运行复制isGreaterThan(animal1,animal2) := true if animal1 weighs more than animal2Copy
这可以给我们一个从最大重量到最小重量的动物列表。
但是,如果我们希望动物从小到大列出呢?这可以通过以下方法轻松实现:
代码语言:javascript代码运行次数:0运行复制isGreaterThan(animal1,animal2) := true if animal weighs less than animal2Copy
也就是说,即使算法需要一个“isGreaterThan”谓词,我们也可以用任何我们想要的方式定义这个谓词,即使使用“小于”而不是“大于”。在前面给出的示例表示中,我们的谓词将是:
代码语言:javascript代码运行次数:0运行复制isGreaterThan(animal1,animal2) := AnimalDescription(animal1, 2) < AnimalDescription(animal2, 2)Copy
4.4. 排序和过滤中的面向对象谓词
在面向对象编程中,谓词可以封装到定义所需函数的类中,例如“isGreaterThan”。然后,排序或过滤算法不仅要处理要处理的对象集,还要具有具有谓词的类。
在 Java 中,我们首先使用以下函数定义一个抽象类:
代码语言:javascript代码运行次数:0运行复制class Predicate {
abstract boolean isGreaterThan(Object x1, Object x2);
}
Copy
然后,排序或过滤算法将在其定义中使用此抽象类来执行其功能。他们期望一个定义了isGreaterThan函数的类。
例如,我们可以定义一个具有函数 addToFilteredSet 的FilterObjects类,该函数将过滤后的对象添加到filteredset 中:
代码语言:javascript代码运行次数:0运行复制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. 结语
在本教程中,我们已经看到了谓词作为返回布尔值的函数的定义。
此外,我们还看到了谓词概念在程序流、筛选和排序中的几种用途。简而言之,每当要提出问题或做出决定时,谓词的概念就会发挥作用。
我们还考虑了将布尔概念扩展到模糊逻辑。这就是我们认识到有时我们无法做出非黑即白的决定的地方。有时会有灰色地带。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2023-02-20,如有侵权请联系 cloudcommunity@tencent 删除java对象函数计算机科学教程
发布评论