1

我有一个项目旨在检查学生程序的正确性。我目前使用这样的方法:

  1. 我指定了学生计划必须实现的目标。

  2. 我将学生程序更改为一系列事实和行动(在 Prolog 中),并检查这些事实和行动是否能够满足目标。

例如,如果我要求学生编写一个程序来求 a + b 的总和,并将结果存储在 c 中,那么我将指定目标是这样的(Prolog 风格):

goal:- hasVarName(VarA, a), hasVarValue(VarA, ValA),
       hasVarName(VarA, b), hasVarValue(VarB, ValB),
       hasVarName(VarC, c), hasVarValue(VarC, ValC),
       Total = ValA + ValB,
       isEqual(Total, ValC).

这种方法可以很好地检查学生的顺序程序。然后,当我尝试检查包含条件的学生程序时,我才意识到可能我不能再使用这种方法了。

例如,如果我要求学生编写程序以使用以下公式从总购买中找到折扣(以美元为单位):

. (总购买量 < 50) -> 客户获得 5% 折扣

. (50 <= 总购买量 < 100)-> 客户获得 10% 的折扣

. (总购买量 >= 100)-> 客户获得 20% 的折扣

那么我不能只写我的目标,折扣的价值(以美元计)只是总采购*百分比折扣。

我面临的一些问题:

  1. 百分比折扣的值可能会根据总购买量的值而有所不同(所以我不能有一个谓词可以用来表示百分比折扣的值)

  2. Total purchase 的值是一个变量值(来自用户的输入) - 所以我永远不知道这个变量的值。因此,我也无法确定特定时间百分比折扣的价值。

  3. 用户可以编写多种变体的 IF 语句,以及 IF 内的条件语句。

有人建议我使用条件规划的概念来解决这类问题。但是当我阅读一些关于条件规划的信息时,我们作为程序员指定了初始状态、计划和目标。就我而言,看起来我是必须指定目标的人,但初始状态和计划是由学生通过解析他们的代码提供的。

所以我想,这有点不同。但是,如果我的想法不正确,请告诉我,并请给我更正。

或者如果不是条件规划,我可以用什么样的方法来解决这种问题(检查学生代码的正确性)?任何信息,无论是理论上的观点还是实际实施中的信息,都非常感谢。

我有一个想法,可能我应该在学生的计划(通过解析他的代码)和我的预期计划之间做一些比较计划之类的事情。因此,如果学生的计划与我的预期计划相同或超集,那么我可以说学生计划/代码是正确的。但我想我应该以比模式匹配更好的方式进行比较(因为我猜,它只是行不通)。但是怎么做?请告诉我,如果这是我必须做的正确方法。

非常感谢。

注意:我之前在此链接中有一个相关但具体的问题: 如何在 Prolog 中编写一种条件规划?. 但是,我刚刚意识到那些特定的问题可能无法帮助我解决这个普遍问题。

4

0 回答 0