Search code examples
listprologdcg

Writing Prolog Code which returns list of integer sums from a given number


I'm trying to write a Prolog predicate that can decomposes a given non-negative integer into every possible sum, using a DCG.

For example:

?- s(3, L, []).
L = [3] ? ;
L = [2,1] ? ;
L = [1,2] ? ;
L = [1,1,1] ? ;
false.

I started by writing a predicate which takes a number N and returns L = [1,2,3,...,N]:

mkList(N, L) :-
   m(0, N, L).

m(X, X, []).
m(Y, L, [H|T]) :-
   H is Y+1,
   m(H, L, T).

However, I'm not sure how I can proceed.

s(Input) -->
   { mkList(Input, InputList) },
   { member(X, InputList) },
   [X].

This is what I was going to use, it starts out my running through the list one by one. However, I'm not sure where I should include a rule to find the difference between X and Input.


Solution

  • the base case is easy:

    all_sum(N) --> [N].
    

    now, we can call recursively if we provide a M between 1 and N, and take the rest R (beware it must be > 0)

    all_sum(N) --> {...},[M],all_sum(R).
    

    please fill the dots using the hints above. You will get

    ?- phrase(all_sum(3),L).
    L = [3] ;
    L = [1, 2] ;
    L = [1, 1, 1] ;
    L = [2, 1] ;
    false.