如何根据Prolog的结果和If-Statement分配值?

时间:2017-11-18 03:21:10

标签: prolog

所以我给了一个迷宫,我正试图找出开放邻居的数量(相邻的地点有这个角色'或者' - ') 。

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;
}

1 个答案:

答案 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。