我是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,但这个根本不起作用)
    我已经被困了几个小时,这就是为什么我转向你们的原因,请帮忙!
    谢谢。

    最佳答案

    您需要采取以下措施解决最简单的情况:

    s2intAux(0,0).
    

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

    在接下来的几行中,当您用完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.
    

    关于prolog - 基本的PROLOG计数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16778782/

    10-11 07:43