基本的PROLOG计数

时间:2013-05-27 18:38:13

标签: prolog successor-arithmetics

我是prolog的新手我试图编写一个重要的谓词: 给定时,谓词名称为s2int:

  • s2int(0,Y)它应该"返回" Y = 0。
  • s2int(s(0),Y)=> Y = 1。
  • s2int(s(s(0)),Y)=> Y = 2。
  • s2int(S(s(s(0))),Y)=> Y = 3。

等等.. 这是我试着写的(非常糟糕), 起初我尝试了这段代码:

s2intAux(0,Y).
s2intAux(X,Y):- X = s(Z) ,Y1 is Y+1, s2intAux(Z,Y1).

但每当我尝试通过键入s2intAux(s(0),Y)来运行它时,我会收到错误消息:" ERROR:is / 2:参数未充分实例化" 我很好地得到了这个错误,因为Y未定义。 然后我尝试了这个:

s2intAux(0,Y).
s2intAux(X,Y):- X = s(Z) ,Y1 is Y+1, s2intAux(Z,Y1).

s2int(X,Y):- Y1 is 0, s2intA(X,Y1).

(我试图以零值开始Y但是这个根本没有工作) 我已经被困了几个小时了,这就是我转向你们的原因,请帮忙! 谢谢。

1 个答案:

答案 0 :(得分:2)

您需要以下内容来解决最简单的案例:

s2intAux(0,0).

当Y被实例化为0时,这将导致s2intAux(0,Y)为真。

在后续行中,当您用尽Z时,您没有将s(.)解析为0的语句。为此,您需要处理单s(0)个案。然后你可以做一般情况:

s2intAux(X,Y) :- X = s(0), Y is 1.
s2intAux(X,Y) :- X = s(Z), s2intAux(Z,Y1), Y is Y1 + 1.

请注意,在一般情况下,我们必须向下移动才能到达Y is 1 之前我们可以解开备份并最终分配Y to Y1 + 1

您也可以将第一行写为:

s2intAux(s(0),Y) :- Y is 1.

最终答案如下:

s2intAux(0,0).
s2intAux(s(0),Y) :- Y is 1.
s2intAux(X,Y) :- X = s(Z), s2intAux(Z,Y1), Y is Y1 + 1.