List prolog使用后继符号添加两个列表

List prolog使用后继符号添加两个列表,list,prolog,add,List,Prolog,Add,我不熟悉prolog,我正在做一些练习。我在后继符号中添加了两个列表。问题和答案应该用后继符号表示,但为了方便起见,我用数字表示 列表([1,1,1,1],[2,2,2],[3,3,3,3]) 列表([9,9,9,9],[1,1,1,1],[1,1,1,0]) 我很容易用后继符号得到问题二[10,10,10,10]的答案,但答案需要我们处理数字,这意味着期望的ans是[s(0),s(0),s(0),s(0),0])。我使用的是简单的加法结转法 add(0, X, X). add(s(X), Y,

我不熟悉prolog,我正在做一些练习。我在后继符号中添加了两个列表。问题和答案应该用后继符号表示,但为了方便起见,我用数字表示

  • 列表([1,1,1,1],[2,2,2],[3,3,3,3])
  • 列表([9,9,9,9],[1,1,1,1],[1,1,1,0])

  • 我很容易用后继符号得到问题二[10,10,10,10]的答案,但答案需要我们处理数字,这意味着期望的ans是[s(0),s(0),s(0),s(0),0])。

    我使用的是简单的加法结转法

    add(0, X, X).
    add(s(X), Y, s(Z)) :-
        add(X, Y, Z).
    
    % Helper to convert b/w decimal and succ notation.
    sform(0, 0).
    sform(N, s(S)) :-
        N > 0, N1 is N - 1,
        sform(N1, S).
    
    sumdigits([], [], [], 0).
    sumdigits([X|Xs], [Y|Ys], [Z|Zs], C) :-
        sumdigits(Xs, Ys, Zs, C1),
        (C1 = 0 -> add(X, Y, Z1); add(X, s(Y), Z1)),
        (  Z1 = s(s(s(s(s(s(s(s(s(s(Z))))))))))
        -> C = s(0)
        ;  Z1 = Z, C = 0
        ).
    
    sumdigits(Xs, Ys, Zs) :-
        sumdigits(Xs, Ys, Zs1, C),
        (C = 0 -> Zs = Zs1; Zs = [C|Zs1]).
    

    显示部分解决方案。列出([]、[]、[])。列表([H1 | L1],[H2 | L2],[H3 | L3]):-lsum(L1,L2,L3),sum(H1,H2,0,H3)。sum(a,b,c,d)是一个方程a+b=c+d。我们要问的问题是指上一个问题,[9,9,9]和[1,1,1,1]的和不应该是[1,1,1,1,0]?是的,对不起。让我来编辑这个问题。真的很抱歉我的错误,我不知道这是多少初学者友好。你确定这个练习是为初学者做的吗?另一个要求是不允许在Prolog中使用任何内置谓词。我根据你的解决方案想了一个小时,但还是解决不了。请给我一些提示好吗?这是我们学院的家庭作业,在一节课和一个教程中介绍了prolog和声明式编程。目的是让我们体验一下prolog。我最大的问题是不知道如何将这部分转换为谓词。我可以在我的程序中得到C1的值。这部分是内置谓词吗?谢谢(C1=0->add(X,Y,Z1);add(X,s(Y),Z1)),(Z1=s(s(s(s(s(s(s)(s)(Z(Z))))))))->C=s(0);Z1=Z,C=0)。把
    (A->B;C)
    想象成
    如果A,那么B,C
    。因此,该语句表示:如果进位(C1)为零,则
    Z1=X+Y
    ,否则
    Z1=X+Y+1
    。下一个表示:如果Z1大于10,则将最终进位(C)设置为1,将Z设置为Z1-10,否则将进位(C)设置为0,将Z设置为Z1。
    ?- maplist(sform, [9, 9, 9, 9], X), maplist(sform, [1, 1, 1, 1], Y), sumdigits(X, Y, Z).
    X = [s(s(s(s(s(s(s(s(s(0))))))))), s(s(s(s(s(s(s(s(s(0))))))))), s(s(s(s(s(s(s(s(s(0))))))))), s(s(s(s(s(s(s(s(s(0)))))))))],
    Y = [s(0), s(0), s(0), s(0)],
    Z = [s(0), s(0), s(0), s(0), 0]