【发布时间】:2012-10-25 01:44:44
【问题描述】:
我尝试编写一个可以理解用 C# 编写的学生程序的 prolog 代码。现在我陷入了识别学生程序中“if”语句的过程中。例如: 以下是我期望学生提供的代码。
int d = int.Parse(Console.ReadLine()); // value d is inputted by user
int s = 0;
if (d>0)
s = 2;
else if (d==0)
s = 1;
else
s = 0;
我将这段预期代码的目标定义为:
goal:-
hasVarName(Vid_s, s),
hasVarName(Vid_d, d),
hasVarValue(Vid_d, Vd),
((not(gt(Vd,0)); hasVarValue(Vid_s, 2)), %eq: [Vd>0] -> [val_s = 2]
((gt(Vd,0); not(eq(Vd,0)); hasVarValue(Vid_s, 1)), %eq: [~(Vd>0)^(Vd=0)] -> [val_s = 1]
((gt(Vd,0); eq(Vd,0); hasVarValue(Vid_s, 0). %eq: [~(Vd>0)^~(Vd=0)] -> [val_s = 0]
问题是如何在 prolog 事实和规则中表示上述学生代码,以找出任何可能的条件都满足目标。
我试图将学生代码的第一部分更改为如下所示的事实,但真的不知道如何将学生的“if”语句表示为 prolog 中的事实/规则(我想,我不应该更改它的序言'if',对吧?)
hasVarName(varID_d, d)
hasVarValue(varID_d, val_d) %it is unknown, so I represent it as symbol 'val_d'
hasVarName(varID_s, s)
hasVarValue(varID_s, 0)
另外一个,在我的目标中,当我进行比较时,例如gt(Vd,0),我认为我不能使用序言大于运算符,Vd> 0 和 Vd @> 0 都不是因为 Vd 中的值实际上是输入的某个值由用户,但它表示为符号值(在本例中为:val_d)。
注意:使用上述目标,我认为如果将学生代码更改为以下代码,则可以满足定义的目标。
int d = int.Parse(Console.ReadLine()); // value d is inputted by user
int s = 0;
if (d>0)
s = 2;
else if (d==0)
s = 1;
或
int d = int.Parse(Console.ReadLine()); // value d is inputted by user
int s = 10; // any random initialization
if (d>0)
{
int x = 2; // unnecessary step, but still Ok.
s = x;
}
else if (d==0)
s = 1;
else
s = 0;
但同样,我需要帮助/了解如何在 prolog 中将此代码表示为操作/规则/事实以实现目标。
非常感谢任何帮助。
非常感谢
【问题讨论】:
标签: prolog conditional planning clpfd