users-prolog
[Top][All Lists]

Re: Constraining two vectors to be different

 From: Thomas Bourdeaud'huy Subject: Re: Constraining two vectors to be different Date: 01 Jul 2003 09:57:16 +0200

```Yes, but the problem is that the size of vectors may change with the
applications ...

Is it possible to define a predicate like :

vectDif([],[]).
vectDif([E1|R1],[E2|R2]):-
(E1 #\= E2) #\/ vectDif(R1,R2).

I have tried but Gprolog doesn't like the second member ...

Or anything defined with a negation : not(Vect1 #= Vect2) for example ?

Thanks

Thomas

Le mar 01/07/2003 à 08:50, LECONTE Jean Michel a écrit :
> try
>
> vectDif([A,B],[C,D]):-
>         (A#\= C) #\/ (B #\=D ). % means A not equal to C OR B not equal
> to D
> notIn(_,[]):-!.
> notIn(E,[E1|List]):-
>         vectDif(E,E1),
>         notIn(E,List).
>
> tousDif([_]):-!.
> tousDif([E|List]):-
>         notIn(E,List),
>         tousDif(List).
>
>
>
> but here you have to represent a vector as a list of two elements
> Jean Michel LECONTE
> ENI de Brest
>
>
>
> > Hi, I'm using the FD solver,
> > and  try to define the predicate allDiferent(List_Of_Vectors)
> > I use this predicate not to verify that all the vectors are different,
> > but to constrain the variables of these vectors not to allow them to
> be
> > equals...
> >
> > I know that \= and #\=# exist, but i defined :
> >
> > vectDif(E1,E2):-
> >     \=(E1,E2).
> >
> > notIn(_,[]):-!.
> > notIn(E,[E1|List]):-
> >     vectDif(E,E1),
> >     notIn(E,List).
> >
> > tousDif([_]):-!.
> > tousDif([E|List]):-
> >     notIn(E,List),
> >     tousDif(List).
> >
> > And tested :
> >
> > tousDif([[1,2],[3,4]]).
> > yes
> >
> > tousDif([[1,2],[X,4]]).
> > yes
> >
> > tousDif([[1,2],[X,2]]).
> > no
> >
> > The last result is not the one i needed : i just wanted to make X <>
> > 1...
> >
> > If I use  #\= or #\=# in the definition of vectDif, the results are :
> >
> > tousDif([[1,2],[3,4]]).
> > uncaught exception: error(type_error(fd_evaluable,[1,2]),(#\=)/2)
> >
> > tousDif([[1,2],[X,4]]).
> > uncaught exception: error(type_error(fd_evaluable,[1,2]),(#\=)/2)
> >
> > What's wrong with my implementation ? Is there a 'dif' function in GNU
> > Prolog ?
> >
> > Thanks,
> >
> > Thomas Bourdeaud'huy
> > Ecole Centrale de Lille
>
>

```