C#で書かれた学生プログラムを理解できるプロローグコードを書いてみました。今、私は学生のプログラムの「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 に変更しないでください)。 「もし」ですよね?)
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)
もう 1 つは、私の目標では、演算子よりも大きいプロローグを使用できないと思うような比較があるgt(Vd,0)
場合、Vd の値が実際にはユーザーによって入力された特定の値ではなく、シンボリック値として表されます (この場合は : )。Vd> 0
Vd @> 0
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;
しかし、繰り返しになりますが、目標を達成するために、このコードをプロローグでアクション/ルール/ファクトとしてどのように表現できるかについて、ヘルプ/アイデアが必要です。
どんな助けでも本当に感謝しています。
どうもありがとう