序言使用后继表示法添加两个列表
prolog add two list using successor notation
我是 prolog 的新手,我正在做一些练习来练习。我在后继符号中添加了两个列表。问题和答案应该用后继符号显示,但为了方便,我写成数字。
- 列表([1,1,1,1],[2,2,2,2],[3,3,3,3])
- 列表([9,9,9,9],[1,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]).
?- 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]
我是 prolog 的新手,我正在做一些练习来练习。我在后继符号中添加了两个列表。问题和答案应该用后继符号显示,但为了方便,我写成数字。
- 列表([1,1,1,1],[2,2,2,2],[3,3,3,3])
- 列表([9,9,9,9],[1,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]).
?- 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]