Re: [eclipse-clp-users] Constraints on list

From: Edgaonkar, Shrirang <Shrirang.Edgaonkar_at_...390...>
Date: Thu, 29 Jan 2015 00:56:43 +0000
Dear Kish,

  Thanks for your reply. I read your comments and agree. I read about lists in Prolog and now I know how to achieve the following. 



From: Kish Shen [kisshen@...5...]
Sent: 28 January 2015 12:06:36
To: Edgaonkar, Shrirang;
Subject: Re: [eclipse-clp-users] Constraints on list

Hi Shirang,

On 24/01/2015 01:06, Edgaonkar, Shrirang wrote:
> Dear Eclipse-clp users,
>    Following is my problem. I have searched through the forum archives for this solution but in vain. I have encountered dynamic structures but not list. I need to add constraints on List through indexed elements as below. The resultant List should be evaluated based on the constraints. In the eclipse samples at_most_one is what i mean to create. Instead of at_most_one it will be at_most_N in my case. It is just a thought though. I have mentioned the desired output too.

I am not sure if I correctly understand what you are asking about -- you
seem to be asking how you can access a list element via its 'index',
i.e. its position in the list. This is a not a question about
constraints, as your title suggest, but a question about how to program
and use lists in Prolog.

The short answer is that ECLiPSe does not provide any concise syntax to
allow an indexed access to the list elements. This is because accessing
an element of a list requires traversing the list from the head until
you reach the element.

If you need to access elements with an index, then using a list is
normally a bad idea. It sounds like you are unfamiliar with Prolog, as
you say you have not encountered lists before. If this is the case, I
strongly suggest that you learn Prolog first, so that you know how to
use the data structures Prolog/ECLiPSe provide.

What is the reason you want to use a list? The example you show, in
which the length of the list is known at run-time, you can use an array.

Lists are normally used when you don't know at run time how large the
data would be. However, in the case of constraints, by the time you post
the constraint, the number of elements in the list is known. If you need
to access the individual elements via an index, you should convert the
list to an array (e.g. using =../2), and you can access the array
element using the syntax you show (A[1] etc.).

About constraints on lists -- it looks like you are talking about finite
domain constraints here. Both ic and gfd provide finite domain
constraints that works on collections (lists or arrays/matricies). You
have not describe what you want your at_most_N constraint to do, but if
you want to constrain the number of occurrences of values in the
collection, both ic and gfd provide several constraints to do this --
e.g. atmost/3, occurrences/3, gcc/2 -- do these do what you want?




> :- lib(ic).
> solve(A,B) :-
>   B :: 1 .. 10,
>   length(A, B),
>   A[4] #= 1,
>    A[6] #= 2,
>   search([B],0,input_order,indomain_split,complete,[]).
> Output
> ?- solve(A, B).
> A = [_,_,_,_,1,_2]
> B = 6
> Yes (0.00s cpu, solution 1, maybe more)

Disclaimer: This email and any attachments are sent in strictest confidence
for the sole use of the addressee and may contain legally privileged,
confidential, and proprietary data. If you are not the intended recipient,
please advise the sender by replying promptly to this email and then delete
and destroy this email and any attachments without any further use, copying
or forwarding.
Received on Thu Jan 29 2015 - 00:56:56 CET

This archive was generated by hypermail 2.2.0 : Mon Jul 09 2018 - 02:05:30 CEST