我试图编写一个可以理解用 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 中的事实/规则(我想,我不应该将其更改为 prolog “如果”,对吧?)
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;
但同样,我需要帮助/想法如何在序言中将此代码表示为操作/规则/事实以实现目标。
非常感谢任何帮助。
非常感谢