# Re: some quick help with lists

**From:** Tom Schrijvers (*Tom.Schrijvers_at_cs.kuleuvenspam.ac.be*)

**Date:** 11/23/04

**Next message:**Jan Wielemaker: "Re: SWI PROLOG - JAVA Interface - NEED HELP --- URGENT"**Previous message:**Matthew Huntbach: "Re: some quick help with lists"**In reply to:**dirty_bit: "some quick help with lists"**Next in thread:**dirty_bit: "Re: some quick help with lists"**Reply:**dirty_bit: "Re: some quick help with lists"**Messages sorted by:**[ date ] [ thread ] [ subject ] [ author ]

Date: Tue, 23 Nov 2004 11:27:54 +0100

dirty_bit wrote:

*> What I thought would be a simple first program to write in Prolog has
*

*> some how become a problem. I am attempting to write a rule that takes
*

*> a list and an integer. The integer is the sum of two elements in the
*

*> list. (e.g. sum(list, num) ).
*

*>
*

*> I was trying to do something along the lines of:
*

*>
*

*> sum([H|T], A) :- select([H|T],X1,T2), select(T2,X2,_), A is +(X1,X2).
*

*>
*

*> This works just fine, but I would like for it to also be able to go
*

*> the other way too. For example if I gave it sum(X, 3). X would equal:
*

*> [1,2], [2,1], [1,2,3], etc. And it would need to stop at a certain
*

*> list length that I could specify so it doesn't loop forever.
*

*>
*

*> Any suggestions would be greatly appreciated. Perhaps my code needs to
*

*> be completely rewritten?
*

Arithmetic only works one way in plain Prolog: it is a one way constraint.

Only the A is allowed to be an unknown value. X1 and X2 have to be known.

Constraint Logic Programming extends Prolog with full arithmetic

constraints.

Here is some code that imports the simple integer arithmetic constraint

solver included in SWI-Prolog.

:- use_module(library('clp/bounds')).

% generate a list of variables bounded by some maximal length

variable_list([],_).

variable_list([X|Xs],N) :-

N > 0,

M is N - 1,

variable_list(Xs,M).

% compute sum of elements in list

sum([],S) :-

S #= 0.

sum([X|Xs],S) :-

S #= X + S0,

sum(Xs,S0).

Now you can run your in different modi:

% straightforward:

?- sum([1,2],S).

S = 3 ;

No

% backwards:

?- variable_list(L,3), L in 1..10, sum(L,S), S #= 3, label([S|L]).

L = [3] ;

L = [1, 2] ;

L = [2, 1] ;

L = [1, 1, 1] ;

No

L in 1..10 constraints the variables in the list to be between 1 and 10,

otherwise there's an infinite number of possibilities. Labelling of the

variabels is necessary to instantiate the variables in the list to an

actual solution.

You can add additional constraints to the variabels in the list or drop the

S #= 3 constraint to run in a different modus.

Check the documentation of SWI-Prolog for more possibilities or look at the

constraints solvers included in your favorite Prolog system.

Tom

**Next message:**Jan Wielemaker: "Re: SWI PROLOG - JAVA Interface - NEED HELP --- URGENT"**Previous message:**Matthew Huntbach: "Re: some quick help with lists"**In reply to:**dirty_bit: "some quick help with lists"**Next in thread:**dirty_bit: "Re: some quick help with lists"**Reply:**dirty_bit: "Re: some quick help with lists"**Messages sorted by:**[ date ] [ thread ] [ subject ] [ author ]