2017-11-18 78 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。