所以我给了一个迷宫,我正试图找出开放邻居的数量(相邻的地点有这个角色'或者' - ') 。
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函数为up,down,left和right但是如何在openCount函数中格式化if语句?我不确定如何比较我的'什么'变量' g'和' - '。
我想要做的Java等价物是:
if(What.equals('g')||What.equals('-')){
return 1;
}else{
return 0;
}
答案 0 :(得分:2)
aaargh ....
帮自己一个忙 - 现在,放逐 - >从你的心里。引入它是为了避免一行谓词,对于经验丰富的prolog程序员来说,它还可以(并且可以避免格鲁选择点,fwiw)。
=:='数字相等',如5 =:= 3 + 2
什么=:= g
会因为“g不是一种功能而感到恐惧”。 = is'统一' - 试图迫使双方成为同一个东西,如果不能,就会失败。 ==是'相同',如果确定双方是相同的,则成功。比如,你和我住在同一栋楼里吗?很可能,我们都可能住在公寓或房子里,但我们不知道。它永远不会束缚事物。
你也可能想做算术。 '是'是运营商。
X是5 + 6 * Y
请注意,您无法自动进行算术运算,例如较少的语言 - 调用foo(5 + Y)不起作用,它将' +(5,Y)传递给foo。这种不便被很多精彩所抵消,特别是foo可以决定如何处理它的论点。因此matrix_math(5 * X + Y * Z)可以评估矩阵。你可以随时编写语言。 8cD这很好。
类注释中的某个地方可能是代码封装单元被称为谓词,而不是函数'。
所以,虽然我假设当你谈论函数时,你意味着谓词,但希望编写' g的维护者不是函数'知道正确的术语,真正意味着这里的功能。
是的 - 那是因为它们意味着内置功能,其中有一些功能。他们进入算术公式。高度是半径* sin(Theta)
罪是罪的功能。您无法定义自己的功能。如果你是一个没有sin函数的序言并且想要定义它,你需要以某种方式返回值并使用谓词。
罪恶(Theta,SinTheta): - ......一些代码.......我确信此刻所有这一切看似随意而且有些疯狂。
openCount的第二个参数周围的parens并不是很有用。 并且你不想传递openCount' +'(C,1)
succ(上一页,下一页)是一个有用的内置谓词,'
的继承者succ(左,C), succ(C,右), succ(上面,R), succ(R,Below)
我真的鼓励将规则的主体缩进一级。
最后,谓词_names_are_like_this_by_convention。 thisTooIsAnAtomSoItsAPredicateNameButDontDoIt。 < - 你这样做 ThisIsRightOutAndWontCompile。