3

我是 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) 来运行它时,我都会收到一条错误消息:“错误: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,但这个根本不起作用)我已经被困了几个小时,这就是为什么我转向你们,请帮助!谢谢你。

4

1 回答 1

2

您需要以下内容来解决最琐碎的情况:

s2intAux(0,0).

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

在您的后续行中,Z当您用完s(.). 为此,您需要处理单个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.
于 2013-05-27T19:12:55.993 回答