我試着編寫一個可以理解用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(*)這樣更具象徵意義的東西。 –