2

我只是想知道是否有人知道如何在伪代码中表示前提条件,因为我环顾四周找不到任何关于该主题的内容。

谢谢

4

2 回答 2

3

根据定义,伪代码不是形式化的代码。使用伪代码为 C# 方法定义前提条件的示例如下:

// Precondition: Object must have been initialized by calling init() or by
// manually setting properties X and Y such that X.Foo >= Y.Bar.
public void doUsefulWork() {
    ...
}

显然,由于伪代码没有形式化,编译器无法对其进行验证。

  • 该方法的使用者有责任确保满足先决条件,并且
  • 方法的开发人员有责任承认更改前提条件(通常)是一项重大更改。
于 2012-08-01T11:21:17.647 回答
3

我在这里看到两种可能性:

  1. 如果您可以将您的条件表述为真实代码,我会尝试使用断言编程(或 .NET 等效的Debug.Assert)。这样,您实际上可以在运行时检查您的条件assert condition

  2. 如果不是这种情况,或者您根本不想这样做,您可以将前置条件和后置条件写入您的 JavaDoc。

    /**
     * @precondition: the connection has been established.
     * 
     * @postcondition: the schema is created.
     * 
     */
    

您甚至可以定义这些JavaDoc 注释,以便它们出现在 JavaDoc 生成的文档中。这样你就可以使用自然语言来定义你想要断言的内容。

您还可以更数学地表达您的前置条件和后置条件,以增加条件的简洁性,这可能会使它们更易于理解:

对于简单的数字比较,您当然可以使用<, <=, >,>=等。但是假设您想为 a 定义不变量,Set那么您可以将其表示为:

/**
  * @invariant: set == filterDuplicates(set)
  *
  */

从而利用假设/伪函数来表达您的条件。

如果您喜欢函数式语言,则可以进一步开发。我的数据结构和算法教授使用Haskell为新引入的数据结构定义前置条件、后置条件和不变量:

module TreeSets(TreeSet, 
                contains, add, remove, card, traverse)
where
data Ord t => TreeSet t = E | N (TreeSet t) t (TreeSet t)

inv E = True
inv(N l x r) = all(<x)(abs l) && all(>x)(abs r) &&
   inv l && inv r

这真的取决于你为谁写这篇文章,因此我的建议是使用自然语言。每个人都可以理解,尤其是面向对象的程序最容易制定。

于 2012-08-01T11:23:36.657 回答