On Sat, 2020-07-25 at 13:35 +0200, Domingo Alvarez Duarte wrote:
> Hello !
> 
> Trying to change the actual TUPLE structure by:
> 
> ====
> 
> #ifndef TUPLE_SIZE_T
> #define TUPLE_SIZE_T int
> #endif
> struct TUPLE
> {
>        TUPLE_SIZE_T size;
>        TUPLE_SIZE_T refcount;
>        SYMBOL sym[1];
>        /* symbol, which the component refers to; cannot be NULL */
> };
> 
> ====
> 
> I found the code bellow (in src/mpl/mpl3.c) that I'm not sure I 
> understand it,
> 
> it seems that it's only testing the last tuple against 
> "code->arg.arg.y", shouldn't it be testing inside the loop for every
> tuple ?
> 
> I would appreciate someone could help understand this code !
> 
> ====
> 
> int is_member(MPL *mpl, CODE *code, const TUPLE *tuple)
> {     int value;
> ...
> 
>           case O_CROSS:
>              {  int j;
>                 value = is_member(mpl, code->arg.arg.x, tuple);
>                 if (value)
>                 {  for (j = 1; j <= code->arg.arg.x->dim; j++)
>                    {  xassert(tuple != NULL);
>                       tuple = tuple->next;
>                    }
>                    value = is_member(mpl, code->arg.arg.y, tuple);
>                 }
>              }
>              break;
> 
> ====
> 
> Cheers !
> 
> 
> 

The routine is_member checks if the given n-tuple (specified by
'tuple') is a member of the given set (specified by 'code'). The check
is performed recursively by traversing the set expression tree. For
example, on evaluating the condition "... (x,y) in X cross Y ..." the
routine will check that x is in X and y is in Y.




Reply via email to