2017-11-18 196 views
0

所以我得到了一個迷宮,我試圖找出開放鄰居的數量(相鄰點具有字符'g'或' - ')。如何根據Prolog的結果和If-Statement來分配值?

openNeighbors(Maze,(R,C),Answer):- 
openCount(Maze,(R-1,C),Up), 
openCount(Maze,(R+1,C),Down), 
openCount(Maze,(R,C-1),Left), 
openCount(Maze,(R,C+1),Right), 

Answer is Up+Down+Left+Right. 

openCount(Maze,Space,Count):- 
    find2D(Maze,What,Space), 
    ( What =:= - -> 
      Count is 1 
    ; What =:= g -> 
      Count is 1 
    ;  Count is 0 
    ) 

我的思維過程是,我可以只要求了openCount功能,下,左,右,但我怎麼格式化我如果openCount函數內聲明?我不確定如何比較我的'What'變量與'g'和' - '。

相當於Java中的什麼我想要做的是:

if(What.equals('g')||What.equals('-')){ 
    return 1; 
}else{ 
    return 0; 
} 

回答

2

aaargh ....

幫自己一個忙 - 現在,驅除 - >從你的頭腦。它被引入使得避免單行謂詞變得容易,對於有經驗的prolog程序員來說,它是可以的(並且可以避免grue選擇點,fwiw)。

=:=是 '數值上等於',如在5 =:= 3 + 2

什麼=:=克

將反常了與 'g是不是一個函數'。 =是'統一' - 它試圖強制雙方成爲同一事物,如果不能成功則失敗。 ==是'相同',如果它確定邊相同,則成功。就像,你和我住在同一棟建築物裏嗎?很可能,我們都可能住在公寓或房子裏,但我們不知道。它永遠不會綁定事物。

你也可能想要算術。 '是'是那個運營商。

X是5+ 6 * Y

通知,你不能自動做算術題一樣,在較小的語言 - 調用foo(5 + Y)不起作用,它通過 '+'(5 ,Y)到foo。這種不便與許多奇妙相反,尤其是foo可以決定如何處理它的爭論。所以matrix_math(5 * X + Y * Z)可以評估矩陣。你可以隨時修改語言。 8cD這很好。

類註釋中的某處可能是代碼封裝單元稱爲謂詞而不是「函數」的事實。所以,雖然我認爲當你談論函數時,你是意義謂詞,但希望寫'g不是函數'的維護者知道正確的術語,並且在這裏意味着函數。

是的 - 這是因爲他們意味着內置函數,其中有幾個。他們進入算術公式。

高是半徑* sin(Theta)

sin是sin函數。你不能定義你自己的功能。如果你在一個沒有sin函數的序言中,想要定義它,你需要以某種方式返回值並使用一個謂詞。

sin(Theta,SinTheta): - ...一些代碼...。

我相信目前所有這些看起來都是隨意的,有點瘋狂。

圍繞openCount的第二個參數的parens沒有用處。 ,你不希望傳遞openCount '+'(C,1)

SUCC(上一頁,下一頁)是一個有用的內置謂詞,

SUCC「的繼任者(左,C) , SUCC(C,右), SUCC(以上,R), SUCC(R,下同)

我真的鼓勵縮進規則一個級別的身體。

最後,predicate_names_are_like_this_by_convention。 thisTooIsAnAtomSoItsAPredicateNameButDontDoIt。 < - 你正在這樣做 ThisIsRightOutAndWontCompile。