4

据我所知,我从来没有遇到过计算机语言中的SHOULD构造,但话说回来,与那里的数百种语言相比,我不知道那么多语言。

无论如何,应该和其他情态动词在自然语言中非常常见,在编写文档和具有法律约束力的合同时它们的含义非常清楚,因此它们并不是真正的灰色术语,理论上可以用编程术语来表达(我猜)。

例如ASSERT,在某种意义上支持MUST构造。

有没有这类事情的实际例子?有没有关于它的研究?我猜测一些基于规则的系统,也许模糊逻辑算法就是这样工作的。

4

8 回答 8

6

我认为try是“应该”和catchfinally以防万一”

于 2009-02-17T07:41:48.520 回答
4

should在自然语言中的确切含义也不明确。当您说“轮子应该排成一行”时,这到底是什么意思?它可能与must的含义相同,但在构造中没有任何意义。否则,您需要有多大的信心才能满足这一点?如果车轮不适合,该怎么办?

在您提到的意义上,有一些等价物,尽管我不知道使用“应该”这个词的语言:

测试/断言

ASSERT通常是语言指令、宏或测试库函数。在与mustASSERT相对应的意义上,一些语言和测试框架为“警告断言”定义了宏,如果检查失败但不会退出或测试失败,则会发出警告消息 - 这将对应于should

异常处理

在某些方面,您可以将抛出的异常视为类似物 - 如果捕获到异常,程序可以处理某些不应该的情况。但有时异常描述了某些事情的失败,因为它必须是程序才能工作,在这种情况下,异常不会被捕获,或者处理程序会使程序优雅地失败。然而,情况并非总是如此 - 有时会执行代码来测试可能会或什至不可能会发生的事情,并且会捕获一个异常,期望它通常会被抛出。

约束逻辑

在各种正式的自然语言文档中, mustshould的一个常见含义是关于约束 - must指定您始终必须满足的约束,如果不能,则您的状态不兼容,而should意味着您将始终满足约束如果给定状态和must隐含的约束是可能的,但如果不可能,那仍然有效。在非正式约束逻辑中,当上下文中存在“外部约束”时,就会发生这种情况——因此验证“解决方案”是否符合“应该”约束”可能只有在了解上下文的情况下才有可能,并且在给定上下文的情况下,您也可能能够满足“应该约束”的不同子集,但不能同时满足。因此,一些约束逻辑规范语言(无论您是称它们为“编程语言”取决于您的定义)具有约束排序的概念 - 第一级约束对应于must,下一级对应于should,并且如果可能,则必须满足约束条件给定外部的所有约束条件(在以前的级别中),即使这与下一个级别中的某些约束冲突,这些约束也不会得到满足。

于 2009-02-17T08:29:35.690 回答
2

@Simon 也许 Try/finally 最接近应该。Try 中的任何内容都应该运行,但并非总是如此。Web 服务应该打开套接字,但如果没有,我们不在乎。

于 2009-02-17T07:54:33.107 回答
2

这种模式在RSpec - dsl 中用于以行为驱动的方式构建测试。

于 2009-02-17T08:14:25.460 回答
2

像“应该”、“可能”、“可能”这样的情态动词可能会引起混淆,因此RFC 2119给出了一个定义,将所有鼻子都指向同一个方向:

SHOULD   This word, or the adjective "RECOMMENDED", mean that there
may exist valid reasons in particular circumstances to ignore a
particular item, but the full implications must be understood and
carefully weighed before choosing a different course.

从这个定义来看,它应该(不是双关语)清楚地表明它是用于规范,而不是程序代码,您希望事情具有确定性。至少会。不过,我可以想象它可以在 AI 中使用。

于 2009-02-17T11:38:58.247 回答
1

Well 应该可以在 prolog 类型语言中找到,作为更软的推论?即逻辑上的结果应该是 x 但可能不是。你可以说结果可能是 x 但不是很明确?

于 2009-02-17T07:40:04.593 回答
1

如果结果不是它应该的,你期望程序的行为是什么?在 ASSERT 的情况下,它是一个异常(AssertException 或类似的)。程序应该抛出异常还是忽略结果?对我来说,两者之间似乎没有任何东西。结果要么被接受,要么不被接受。

否则,您应该指定您期望的行为。:-)

回到断言:如果断言失败,则抛出异常。这取决于你如何处理这个例外。例如,在 java/C# 中,您可以捕获它然后做任何您想做的事情,因此您可以定义断言是否具有 MUST 或 SHOULD 语义。

于 2009-02-17T08:18:23.173 回答
0

嗯,Java2K也有类似的概念。它应该做它被告知的......

信噪比。

于 2009-02-17T08:37:55.373 回答