Summarize atomic elements in deep list in prolog

I am starting to program in Prolog. I wrote this program to summarize a deep list atom with a battery.

    deep_sum(Xs, N) :- deep_sum(Xs, 0, N).
    deep_sum([], N, N).
    deep_sum([X|Y], M, N) :- atomic(X), Q is M + X, deep_sum(Y, Q, N).
    deep_sum([X|Y], M, N) :- M is P + Q, deep_sum(X, P, N), deep_sum(Y, Q, N).

Why am I getting "ERROR: is / 2: Arguments are not copied enough"?

It works fine without battery:

    deep_sum([], 0).
    deep_sum([X|Y], S) :- atomic(X), !, deep_sum(Y, Q), S is Q + X.
    deep_sum([X|Y], S) :- deep_sum(X, P), deep_sum(Y, Q), S is P + Q.
+4
source share
1 answer

The problem is related to your last sentence:

deep_sum([X|Y], M, N) :-  M is P+Q, deep_sum(X,P,N), deep_sum(Y,Q,N).

The direct problem of the error is that neither P nor Q matter at runtime M is P+Q. Just moving it to the back will not solve, however, the proposal has more problems.

. deep_sum(X,P,N) , N - (X), P ". : P , N - , .

. Q , N. , N 3 : , ! , - .

, . N ) , ) ) . a b : : deep_sum(X, M, N1). N1 . . , N1 , , .

, :

deep_sum([X|Y], M, N) :- 
    deep_sum(X, M, N1), 
    deep_sum(Y, N1, N).

deep_sum/3 :

deep_sum(X, M, N) :- 
    number(X), 
    N is M + X.
deep_sum([], N, N).
deep_sum([X|Y], M, N) :- 
    deep_sum(X, M, N1), 
    deep_sum(Y, N1, N).

:

  • ; , , .
  • number/1 atomic/1, .
  • , .
+1

Source: https://habr.com/ru/post/1620071/


All Articles