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.