我试着编写一个可以理解用C#编写的学生程序的prolog代码。现在我被困在识别学生课程中'如果'陈述的过程中。例如: 以下是我期望学生的代码。如何在Prolog中编写一种有条件的规划?
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的“如果”,对吧?)
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;
但同样,我需要帮助/想法如何代码可以在序言为行动/规则/事实上,以满足目标来表示。
任何帮助真的很感激。
非常感谢
CLP这很有趣,但我认为新手可能真的**很难弄清楚它。 – CapelliC
不是我的观点:我也不知道Budi Hartanto是否是新手,也不知道CLP(*)特别困难的统计数据。 CLP(*)应该更简单,因为它更具说明性。 –
此外,没有一些CLP(*)可以验证不多。如果你有int d = int.Parse(Console.ReadLine());那么数据可以是任意的,标准的Prolog穷举搜索实际上不会用于回答您的查询。你需要像CLP(*)这样更具象征意义的东西。 –