Merge branch 'master' of git.dcc.fc.up.pt:yap-6.3

Conflicts:
	C/exo_udi.c
This commit is contained in:
Vitor Santos Costa 2013-07-16 22:35:02 -05:00
commit 7d67d6108e
41 changed files with 266689 additions and 2011 deletions

View File

@ -968,7 +968,7 @@ Yap_absmi(int inp)
CACHE_Y(YREG);
{
struct index_t *i = (struct index_t *)(PREG->u.lp.l);
S_YREG[-1] = (CELL)EXO_OFFSET_TO_ADDRESS(i,i->links[(CELL)(SREG-i->cls)/i->arity]);
S_YREG[-1] = (CELL)LINK_TO_ADDRESS(i,i->links[EXO_ADDRESS_TO_OFFSET(i, SREG)]);
}
S_YREG--;
/* store arguments for procedure */
@ -991,7 +991,7 @@ Yap_absmi(int inp)
ENDOp();
/* check if enough space between trail and codespace */
/* try_exo Pred,Label */
/* try_exo_udi Pred,Label */
Op(try_exo_udi, lp);
/* check if enough space between trail and codespace */
check_trail(TR);
@ -1091,10 +1091,10 @@ Yap_absmi(int inp)
CACHE_Y(B);
{
struct index_t *it = (struct index_t *)(PREG->u.lp.l);
CELL offset = EXO_ADDRESS_TO_OFFSET(it,(CELL *)((CELL *)(B+1))[it->arity]);
BITS32 offset = ADDRESS_TO_LINK(it,(BITS32 *)((CELL *)(B+1))[it->arity]);
d0 = it->links[offset];
((CELL *)(B+1))[it->arity] = (CELL)EXO_OFFSET_TO_ADDRESS(it, d0);
SREG = it->cls+it->arity*offset;
((CELL *)(B+1))[it->arity] = (CELL)LINK_TO_ADDRESS(it, d0);
SREG = EXO_OFFSET_TO_ADDRESS(it, offset);
}
if (d0) {
/* After retry, cut should be pointing at the parent

View File

@ -159,7 +159,7 @@ Yap_AllocCodeSpace(size_t size)
}
static inline char *
call_realloc(char *p, unsigned long int size)
call_realloc(char *p, size_t size)
{
CACHE_REGS
char *out;

View File

@ -1521,7 +1521,7 @@ CreateDBStruct(Term Tm, DBProp p, int InFlag, int *pstat, UInt extra_size, struc
* for the number of links
*/
flag = DBComplex;
CodeAbs += CellPtr(dbg->lr) - CellPtr(dbg->LinkAr);
CodeAbs += (NOfLinks+(sizeof(CELL)/sizeof(BITS32)-1))/(sizeof(CELL)/sizeof(BITS32));
if ((CELL *)((char *)ntp0+(CELL)CodeAbs) > AuxSp) {
LOCAL_Error_Size = (UInt)DBLength(CodeAbs);
LOCAL_Error_TYPE = OUT_OF_AUXSPACE_ERROR;

185
C/exo.c
View File

@ -46,20 +46,153 @@
#define FNV32_OFFSET 2166136261
#define FNV64_OFFSET ((UInt)14695981039346656037)
/*MurmurHash3 from: https://code.google.com/p/smhasher/wiki/MurmurHash3*/
BITS32 rotl32 ( BITS32, int8_t);
inline BITS32 rotl32 ( BITS32 x, int8_t r )
{
return (x << r) | (x >> (32 - r));
}
#define ROTL32(x,y) rotl32(x,y)
//-----------------------------------------------------------------------------
// Finalization mix - force all bits of a hash block to avalanche
BITS32 fmix32 ( BITS32 );
inline BITS32 fmix32 ( BITS32 h )
{
h ^= h >> 16;
h *= 0x85ebca6b;
h ^= h >> 13;
h *= 0xc2b2ae35;
h ^= h >> 16;
return h;
}
//-----------------------------------------------------------------------------
extern inline BITS32
HASH_MURMUR3_32 (UInt arity, CELL *cl, UInt bnds[], UInt sz);
extern inline BITS32
HASH_MURMUR3_32 (UInt arity, CELL *cl, UInt bnds[], UInt sz)
{
UInt hash;
UInt j=0;
int len = 0;
const BITS32 c1 = 0xcc9e2d51;
const BITS32 c2 = 0x1b873593;
hash = FNV32_OFFSET; /*did not find what seed to use yet*/
while (j < arity) {
if (bnds[j]) {
unsigned char *i=(unsigned char*)(cl+j);
unsigned char *m=(unsigned char*)(cl+(j+1));
while (i < m) {
BITS32 k1 = i[0];
k1 *= c1;
k1 = ROTL32(k1,15);
k1 *= c2;
hash ^= k1;
hash = ROTL32(hash,13);
hash = hash*5+0xe6546b64;
i++;
len++;
}
}
j++;
}
//----------
// tail not used becouse len is block multiple
//----------
// finalization
hash ^= len;
hash = fmix32(hash);
return hash;
}
/*DJB2*/
#define DJB2_OFFSET 5381
extern inline BITS32
HASH_DJB2(UInt arity, CELL *cl, UInt bnds[], UInt sz);
extern inline BITS32
HASH_DJB2(UInt arity, CELL *cl, UInt bnds[], UInt sz)
{
BITS32 hash;
UInt j=0;
hash = DJB2_OFFSET;
while (j < arity) {
if (bnds[j]) {
unsigned char *i=(unsigned char*)(cl+j);
unsigned char *m=(unsigned char*)(cl+(j+1));
while (i < m) {
BITS32 h5 = hash << 5;
hash += h5 + i[0]; /* hash * 33 + i[0] */
i++;
}
}
j++;
}
return hash;
}
extern inline BITS32
HASH_RS(UInt arity, CELL *cl, UInt bnds[], UInt sz);
/* RS Hash Function */
extern inline BITS32
HASH_RS(UInt arity, CELL *cl, UInt bnds[], UInt sz)
{
UInt hash=0;
UInt j=0;
UInt b = 378551;
UInt a = 63689;
while (j < arity) {
if (bnds[j]) {
unsigned char *i=(unsigned char*)(cl+j);
unsigned char *m=(unsigned char*)(cl+(j+1));
while (i < m) {
hash = hash * a + i[0];
a = a * b;
i++;
}
}
j++;
}
return hash;
}
extern inline BITS32
HASH_FVN_1A(UInt arity, CELL *cl, UInt bnds[], UInt sz);
/* Simple hash function:
FVN-1A
first component is the base key.
hash0 spreads extensions coming from different elements.
spread over j quadrants.
*/
static BITS32
HASH(UInt arity, CELL *cl, UInt bnds[], UInt sz)
extern inline BITS32
HASH_FVN_1A(UInt ar, CELL *cl, UInt bnds[], UInt sz)
{
UInt hash;
UInt j=0;
hash = FNV32_OFFSET;
while (j < arity) {
while (j < ar) {
if (bnds[j]) {
unsigned char *i=(unsigned char*)(cl+j);
unsigned char *m=(unsigned char*)(cl+(j+1));
@ -75,6 +208,19 @@ HASH(UInt arity, CELL *cl, UInt bnds[], UInt sz)
return hash;
}
//#define TEST_HASH_DJB 1
#if defined TEST_HASH_MURMUR
# define HASH(...) HASH_MURMUR3_32(__VA_ARGS__)
#elif defined TEST_HASH_DJB
# define HASH(...) HASH_DJB2(__VA_ARGS__)
#elif defined TEST_HASH_RS
# define HASH(...) HASH_RS(__VA_ARGS__)
#else
/* Default: TEST_HASH_FVN */
# define HASH(...) HASH_FVN_1A(__VA_ARGS__)
#endif
static BITS32
NEXT(UInt hash)
{
@ -97,8 +243,8 @@ MATCH(CELL *clp, CELL *kvp, UInt arity, UInt bnds[])
static void
ADD_TO_TRY_CHAIN(CELL *kvp, CELL *cl, struct index_t *it)
{
BITS32 old = (kvp-it->cls)/it->arity;
BITS32 new = (cl-it->cls)/it->arity;
BITS32 old = EXO_ADDRESS_TO_OFFSET(it, kvp);
BITS32 new = EXO_ADDRESS_TO_OFFSET(it, cl);
BITS32 *links = it->links;
BITS32 tmp = links[old]; /* points to the end of the chain */
@ -178,7 +324,7 @@ LOOKUP(struct index_t *it, UInt arity, UInt j, UInt bnds[])
return FAILCODE;
} else if (MATCH(kvp, XREGS+1, arity, bnds)) {
S = kvp;
if (!it->is_key && it->links[(S-it->cls)/arity])
if (!it->is_key && it->links[EXO_ADDRESS_TO_OFFSET(it, S)])
return it->code;
else
return NEXTOP(NEXTOP(it->code,lp),lp);
@ -203,10 +349,10 @@ fill_hash(UInt bmap, struct index_t *it, UInt bnds[])
}
for (i=0; i < it->hsize; i++) {
if (it->key[i]) {
UInt offset = it->key[i]/arity;
UInt last = it->links[offset];
BITS32 offset = it->key[i];
BITS32 last = it->links[offset];
if (last) {
/* the chain used to point straight to the last, and the last back to the origibal first */
/* the chain used to point straight to the last, and the last back to the original first */
it->links[offset] = it->links[last];
it->links[last] = 0;
}
@ -244,7 +390,7 @@ add_index(struct index_t **ip, UInt bmap, PredEntry *ap, UInt count)
i->bmap = bmap;
i->is_key = FALSE;
i->hsize = 2*ncls;
dsz = sizeof(BITS32)*(ncls+i->hsize);
dsz = sizeof(BITS32)*(ncls+1+i->hsize);
if (count) {
if (!(base = (CELL *)Yap_AllocCodeSpace(dsz))) {
CACHE_REGS
@ -259,9 +405,10 @@ add_index(struct index_t **ip, UInt bmap, PredEntry *ap, UInt count)
}
i->size = sz+dsz+sizeof(struct index_t);
i->key = (BITS32 *)base;
i->links = (BITS32 *)(base+i->hsize);
i->links = (BITS32 *)base+i->hsize;
i->ncollisions = i->nentries = i->ntrys = 0;
i->cls = (CELL *)((ADDR)ap->cs.p_code.FirstClause+2*sizeof(struct index_t *));
i->bcls= i->cls-i->arity;
*ip = i;
while (count) {
if (!fill_hash(bmap, i, bnds)) {
@ -270,13 +417,13 @@ add_index(struct index_t **ip, UInt bmap, PredEntry *ap, UInt count)
if (i->is_key) {
sz = i->hsize*sizeof(BITS32);
} else {
sz = (ncls+i->hsize)*sizeof(BITS32);
sz = (ncls+1+i->hsize)*sizeof(BITS32);
}
if (base != (CELL *)Yap_ReallocCodeSpace((char *)base, sz))
return FALSE;
bzero(base, sz);
i->key = (CELL *)base;
i->links = (CELL *)(base+i->hsize);
i->key = (BITS32 *)base;
i->links = (BITS32 *)(base+i->hsize);
i->ncollisions = i->nentries = i->ntrys = 0;
continue;
}
@ -295,13 +442,13 @@ add_index(struct index_t **ip, UInt bmap, PredEntry *ap, UInt count)
if (i->is_key) {
sz = i->hsize*sizeof(BITS32);
} else {
sz = (ncls+i->hsize)*sizeof(BITS32);
sz = (ncls+1+i->hsize)*sizeof(BITS32);
}
if (base != (CELL *)Yap_ReallocCodeSpace((char *)base, sz))
return FALSE;
bzero(base, sz);
i->key = (CELL *)base;
i->links = (CELL *)(base+i->hsize);
i->key = (BITS32 *)base;
i->links = (BITS32 *)base+i->hsize;
i->ncollisions = i->nentries = i->ntrys = 0;
} else {
break;
@ -398,8 +545,8 @@ CELL
Yap_NextExo(choiceptr cptr, struct index_t *it)
{
CACHE_REGS
CELL offset = ADDRESS_TO_LINK(it,(CELL *)((CELL *)(B+1))[it->arity]);
CELL next = it->links[offset];
BITS32 offset = ADDRESS_TO_LINK(it,(BITS32 *)((CELL *)(B+1))[it->arity]);
BITS32 next = it->links[offset];
((CELL *)(B+1))[it->arity] = (CELL)LINK_TO_ADDRESS(it, next);
S = it->cls+it->arity*offset;
return next;

View File

@ -41,94 +41,174 @@ static int
compar(const void *ip0, const void *jp0) {
CACHE_REGS
BITS32 *ip = (BITS32 *)ip0, *jp = (BITS32 *)jp0;
BITS32 *bs = LOCAL_exo_base;
Int i = bs[LOCAL_exo_arity*(*ip)+LOCAL_exo_arg];
Int j = bs[LOCAL_exo_arity*(*jp)+LOCAL_exo_arg];
Term i = EXO_OFFSET_TO_ADDRESS(LOCAL_exo_it, *ip)[LOCAL_exo_arg];
Term j = EXO_OFFSET_TO_ADDRESS(LOCAL_exo_it, *jp)[LOCAL_exo_arg];
//fprintf(stderr, "%ld-%ld\n", IntOfTerm(i), IntOfTerm(j));
return IntOfTerm(i)-IntOfTerm(j);
}
static int
compare(const BITS32 *ip, Int j USES_REGS) {
BITS32 *bs = LOCAL_exo_base;
Int i = bs[LOCAL_exo_arity*(*ip)+LOCAL_exo_arg];
Term i = EXO_OFFSET_TO_ADDRESS(LOCAL_exo_it, *ip)[LOCAL_exo_arg];
//fprintf(stderr, "%ld-%ld\n", IntOfTerm(i), j);
return IntOfTerm(i)-j;
}
static void
IntervalUDIRefitIndex(struct index_t **ip, UInt b[] USES_REGS)
{
size_t sz;
struct index_t *it = *ip;
UInt arity = it->arity;
yamop *code;
/* hard-wired implementation for the Interval case */
Int i = it->udi_arg;
/* it is bound, use hash */
if (it->bmap & b[i]) return;
/* no constraints, nothing to gain */
if (!IsAttVar(VarOfTerm(XREGS[i+1]))) return;
LOCAL_exo_base = it->cls;
LOCAL_exo_arity = it->arity;
LOCAL_exo_arg = i;
if (!it->key) {
UInt ncls = it->ap->cs.p_code.NOfClauses, i;
BITS32 *sorted;
/* handle ll variables */
sz = sizeof(BITS32)*(ncls);
/* allocate space */
if (!(it->udi_data = (BITS32*)Yap_AllocCodeSpace(sz)))
return;
sorted = (BITS32*)it->udi_data;
for (i=0; i< ncls; i++)
sorted[i] = i;
qsort(sorted, (size_t)ncls, sizeof(BITS32), compar);
it->links = NULL;
} else {
BITS32 *sorted0, *sorted;
/* be conservative */
sz = sizeof(BITS32)*(2*it->ntrys+it->nentries);
/* allocate space */
if (!(it->udi_data = (BITS32*)Yap_AllocCodeSpace(sz)))
return;
sorted0 = sorted = (BITS32 *)it->udi_data;
sorted++; /* leave an initial hole */
for (i=0; i < it->hsize; i++) {
if (it->key[i]) {
BITS32 *s0 = sorted;
BITS32 offset = it->key[i]/arity, offset0 = offset;
*sorted++ = 0;
do {
*sorted++ = offset;
offset = it->links[offset];
} while (offset);
// S = it->cls+it->arity*offset0; Yap_DebugPlWrite(S[1]);
// fprintf(stderr, " key[i]=%d offset=%d %d\n", it->key[i], offset0, (sorted-s0)-1);
if (sorted-s0 == 2) {
it->links[offset0] = 0;
sorted = s0;
} else {
/* number of elements comes first */
*s0 = sorted - (s0+1);
qsort(s0+1, (size_t)*s0, sizeof(BITS32), compar);
it->links[offset0] = s0-sorted0;
}
}
}
sz = sizeof(BITS32)*(sorted-sorted0);
it->udi_data = (BITS32 *)Yap_ReallocCodeSpace((char *)it->udi_data, sz);
}
it->is_udi = TRUE;
code = it->code;
code->opc = Yap_opcode(_try_exo_udi);
code = NEXTOP(code, lp);
code->opc = Yap_opcode(_retry_exo_udi);
static int
same_free(BITS32 i, BITS32 j, struct index_t *it) {
CELL *ip = EXO_OFFSET_TO_ADDRESS(it, i);
CELL *jp = EXO_OFFSET_TO_ADDRESS(it, j);
UInt m = it->udi_free_args, m0 = 1, x;
for (x=0; x< it->arity; x++) {
if (m0 & m) {
if (ip[x] != jp[x])
return FALSE;
m -= m0;
if (!m)
return TRUE;
}
m0 <<= 1;
}
return TRUE;
}
static UInt free_args(UInt b[], UInt arity, UInt i) {
UInt j;
UInt rc = 0;
for (j=0; j<arity; j++) {
if (i !=j && b[j] == 0)
rc |= 1<<j;
}
return rc;
}
static void
chain(BITS32 *p0, BITS32 *el, BITS32 n, struct index_t *it) {
UInt i;
for (i=0; i<n; i++) {
UInt j, k = i;
if (p0[i])
continue;
p0[i] = i;
for (j=i+1; j<n; j++) {
if (same_free(el[i], el[j], it)) {
p0[j] = k;
k = j;
}
}
}
}
static Int
NEXT_DIFFERENT(Int x0, Int x, BITS32 *p, Int xe)
{
while (x <= xe) {
x++;
if (p[x] < x0 || p[x] >= x)
return x;
}
return x;
}
static Int
BIGGEST_EL(Int x0, BITS32 *p, Int xe)
{
Int x = x0;
while (x <= xe) {
if (p[x] == x0)
x0 = x;
x++;
}
return x0;
}
static void
IntervalUDIRefitIndex(struct index_t **ip, UInt b[] USES_REGS)
{
size_t sz;
struct index_t *it = *ip;
yamop *code;
/* hard-wired implementation for the Interval case */
Int i = it->udi_arg;
/* it is bound, use hash */
if (it->bmap & b[i]) return;
/* no constraints, nothing to gain */
//if (!IsAttVar(VarOfTerm(Deref(XREGS[i+1])))) return;
LOCAL_exo_it = it;
LOCAL_exo_base = it->bcls;
LOCAL_exo_arity = it->arity;
LOCAL_exo_arg = i;
it->udi_free_args = free_args(b, it->arity, i);
if (!it->key) {
UInt ncls = it->ap->cs.p_code.NOfClauses, i;
BITS32 *sorted;
/* handle ll variables */
sz = sizeof(BITS32)*(ncls);
/* allocate space */
if (!(it->udi_data = (BITS32*)Yap_AllocCodeSpace(sz)))
return;
sorted = (BITS32*)it->udi_data;
for (i=0; i< ncls; i++)
sorted[i] = i;
qsort(sorted, (size_t)ncls, sizeof(BITS32), compar);
it->links = NULL;
} else {
BITS32 *sorted0, *sorted;
/* be conservative */
if (it->udi_free_args)
sz = sizeof(BITS32)*(3*it->ntrys+3*it->nentries);
else
sz = sizeof(BITS32)*(2*it->ntrys+2*it->nentries);
/* allocate space */
if (!(it->udi_data = (BITS32*)Yap_AllocCodeSpace(sz)))
return;
sorted0 = sorted = (BITS32 *)it->udi_data;
sorted++; /* leave an initial hole */
for (i=0; i < it->hsize; i++) {
if (it->key[i]) {
BITS32 *s0 = sorted;
BITS32 offset = it->key[i], offset0 = offset;
*sorted++ = 0;
do {
*sorted++ = offset;
offset = it->links[offset];
} while (offset);
// S = EXO_OFFSET_TO_ADDRESS(it, offset0); Yap_DebugPlWrite(S[0]);
// fprintf(stderr, " key[i]=%d offset=%d %d\n", it->key[i], offset0, (sorted-s0)-1);
if (sorted-s0 == 2) {
it->links[offset0] = 0;
sorted = s0;
} else {
/* number of elements comes first */
*s0 = sorted - (s0+1);
qsort(s0+1, (size_t)*s0, sizeof(BITS32), compar);
it->links[offset0] = s0-sorted0;
// fprintf(stderr," %d links %d=%d \n", offset0, s0-sorted0, s0[0]);
if (it->udi_free_args) {
bzero(sorted, sizeof(BITS32)*(*s0));
/* chain elements with same unbound vars together */
chain(sorted, s0+1, *s0, it);
sorted += *s0;
}
}
}
}
sz = sizeof(BITS32)*(sorted-sorted0);
it->udi_data = (BITS32 *)Yap_ReallocCodeSpace((char *)it->udi_data, sz);
}
it->is_udi = i+1;
code = it->code;
code->opc = Yap_opcode(_try_exo_udi);
code = NEXTOP(code, lp);
code->opc = Yap_opcode(_retry_exo_udi);
}
static BITS32 *
binary_search(BITS32 *start, BITS32 *end, Int x USES_REGS)
{
@ -154,9 +234,11 @@ Interval(struct index_t *it, Term min, Term max, Term op, BITS32 off USES_REGS)
BITS32 n;
BITS32 *pt;
BITS32 *end;
BITS32 *pt0, *end0;
Atom at;
LOCAL_exo_base = it->cls;
LOCAL_exo_it = it;
LOCAL_exo_base = it->bcls;
LOCAL_exo_arity = it->arity;
LOCAL_exo_arg = it->udi_arg;
if (!it->links) {
@ -164,11 +246,15 @@ Interval(struct index_t *it, Term min, Term max, Term op, BITS32 off USES_REGS)
n = it->nels;
pt = c;
end = c+(n-1);
pt0 = pt;
end0 = end+1;
} else if (it->links[off]) {
c = (BITS32 *)it->udi_data;
n = c[it->links[off]];
pt = c+(it->links[off]+1);
pt0 = pt = c+(it->links[off]+1);
end = c+(it->links[off]+n);
end0 = end+1;
// fprintf(stderr," %d links %d=%d \n", off, it->links[off], n);
} else {
if (!IsVarTerm(min)) {
Int x;
@ -257,24 +343,67 @@ Interval(struct index_t *it, Term min, Term max, Term op, BITS32 off USES_REGS)
end = pt1;
}
if (IsVarTerm(op)) {
S = it->cls+it->arity*pt[0];
S = EXO_OFFSET_TO_ADDRESS(it, pt[0]);
if (pt < end ) {
YENV[-2] = (CELL)( pt+1 );
YENV[-1] = (CELL)( end );
YENV[-2] = (CELL)( pt+1 );
YENV -= 2;
return it->code;
}
return NEXTOP(NEXTOP(it->code,lp),lp);
}
at = AtomOfTerm(op);
if (at == AtomAny || at == AtomMin) {
S = it->cls+it->arity*pt[0];
} else if (at == AtomMax) {
S = it->cls+it->arity*end[0];
if (at == AtomAny || at == AtomMinimum) {
S = EXO_OFFSET_TO_ADDRESS(it, pt[0]);
} else if (at == AtomMaximum) {
S = EXO_OFFSET_TO_ADDRESS(it, end[0]);
} else if (at == AtomUnique) {
if (end-2 > pt)
return FAILCODE;
S = it->cls+it->arity*pt[0];
S = EXO_OFFSET_TO_ADDRESS(it, pt[0]);
} else if (at == AtomMin) {
Int x0, xe, x;
if (!(it->udi_free_args)) {
S = EXO_OFFSET_TO_ADDRESS(it, pt[0]);
} else {
x0 = pt-pt0;
xe = end-pt0;
S = EXO_OFFSET_TO_ADDRESS(it, pt[0]);
x = NEXT_DIFFERENT(x0, x0, end0, xe);
if (x < xe ) {
YENV[-5] = (CELL)( pt0 ); // base for array of pointed pointers
YENV[-4] = MkIntegerTerm( x ); // where we are in pt0 array
YENV[-3] = MkIntegerTerm( xe ); // our visit will end here
YENV[-2] = MkIntegerTerm( x0 ); // our visit started here
YENV[-1] = (CELL)( end0 ); // base for array into pt
YENV -= 5;
return it->code;
}
}
return NEXTOP(NEXTOP(it->code,lp),lp);
} else if (at == AtomMax) {
Int x0, xe, x, y;
if (!(it->udi_free_args)) {
S = EXO_OFFSET_TO_ADDRESS(it, end[0]);
} else {
x0 = pt-pt0;
xe = end-pt0;
y = BIGGEST_EL( x0, end0, xe );
S = EXO_OFFSET_TO_ADDRESS(it, pt[0]);
x = NEXT_DIFFERENT(x0, x0, end0, xe);
if (x < xe ) {
YENV[-5] = (CELL)( pt0 ); // base for array of pointed pointers
YENV[-4] = MkIntegerTerm( -x ); // where we are in pt0 array
YENV[-3] = MkIntegerTerm( xe ); // our visit will end here
YENV[-2] = MkIntegerTerm( x0 ); // our visit started here
YENV[-1] = (CELL)( end0 ); // base for array into pt
YENV -= 5;
return it->code;
}
}
return NEXTOP(NEXTOP(it->code,lp),lp);
}
return NEXTOP(NEXTOP(it->code,lp),lp);
}
@ -284,7 +413,7 @@ IntervalEnterUDIIndex(struct index_t *it USES_REGS)
{
Int i = it->udi_arg;
Term t = XREGS[i+1], a1;
BITS32 off = EXO_ADDRESS_TO_OFFSET(it, S)/it->arity;
BITS32 off = EXO_ADDRESS_TO_OFFSET(it, S);
// printf("off=%d it=%p %p---%p\n", off, it, it->cls, S);
attvar_record *attv;
@ -310,14 +439,40 @@ IntervalEnterUDIIndex(struct index_t *it USES_REGS)
static int
IntervalRetryUDIIndex(struct index_t *it USES_REGS)
{
CELL *w = (CELL*)(B+1);
BITS32 *end = (BITS32 *) w[it->arity+2],
*pt = (BITS32 *) w[it->arity+1];
BITS32 f = *pt;
CELL *w = (CELL*)(B+1)+it->arity;
if (IsVarTerm(w[2])) {
BITS32 *end = (BITS32 *) w[2],
*pt = (BITS32 *) w[1];
BITS32 f = *pt;
S = it->cls+it->arity*f;
if (pt++ == end) return FALSE;
w[it->arity+1] = (CELL)pt;
S = EXO_OFFSET_TO_ADDRESS(it, f);
if (pt++ == end) return FALSE;
w[1] = (CELL)pt;
} else {
BITS32 *pt0 = (BITS32 *)w[1];
Int x = IntegerOfTerm( w[2] );
Int xe = IntegerOfTerm( w[3] );
Int x0 = IntegerOfTerm( w[4] );
BITS32 *base = (BITS32 *)w[5];
if ( x > 0) {
//Yap_DebugPlWrite( EXO_OFFSET_TO_ADDRESS(it, el[i])[1] ); fprintf(stderr,"\n");
S = EXO_OFFSET_TO_ADDRESS(it, pt0[x]);
//fprintf(stderr,"S=%p x=%d/%d %d %d %p %p \n", S, x, base[x], x0, xe, pt0, base);
x = NEXT_DIFFERENT(x0, x, base, xe);
if (x > xe) return FALSE;
w[2] = MkIntegerTerm(x);
} else {
x = -x;
//Yap_DebugPlWrite( EXO_OFFSET_TO_ADDRESS(it, el[i])[1] ); fprintf(stderr,"\n");
S = EXO_OFFSET_TO_ADDRESS(it, pt0[BIGGEST_EL(x, base, xe) ]);
x = NEXT_DIFFERENT(x0, x, base, xe);
// fprintf(stderr,"S=%p x=%d/%d %d %d %p %p \n", S, x, base[x], x0, xe, pt0, base);
if (x > xe) {
return FALSE;
}
w[2] = MkIntegerTerm(-x);
}
}
return TRUE;
}

View File

@ -1025,7 +1025,7 @@ p_nb_linkval( USES_REGS1 )
static Int
p_nb_create_accumulator( USES_REGS1 )
{
Term t = Deref(ARG1), acct, to;
Term t = Deref(ARG1), acct, to, t2;
CELL *destp;
if (IsVarTerm(t)) {
@ -1043,6 +1043,10 @@ p_nb_create_accumulator( USES_REGS1 )
to = CopyTermToArena(t, LOCAL_GlobalArena, TRUE, TRUE, 2, &LOCAL_GlobalArena, garena_overflow_size(ArenaPt(LOCAL_GlobalArena) PASS_REGS) PASS_REGS);
if (to == 0L)
return FALSE;
t2 = Deref(ARG2);
if (IsVarTerm(t2)) {
return Yap_unify(t2, Yap_MkApplTerm(FunctorGNumber,1,&to) );
}
destp = RepAppl(Deref(ARG2));
destp[1] = to;
return TRUE;
@ -1083,7 +1087,7 @@ p_nb_add_to_accumulator( USES_REGS1 )
/* forget it if it was something else */
destp[1] = new;
} else {
/* long, do we have spapce or not ?? */
/* long, do we have space or not ?? */
if (IsLongIntTerm(t0)) {
CELL *target = RepAppl(t0);
CELL *source = RepAppl(new);
@ -1130,7 +1134,7 @@ p_nb_add_to_accumulator( USES_REGS1 )
static Int
p_nb_accumulator_value( USES_REGS1 )
{
Term t = Deref(ARG1), to;
Term t = Deref(ARG1);
Functor f;
if (IsVarTerm(t)) {
@ -1145,8 +1149,7 @@ p_nb_accumulator_value( USES_REGS1 )
if (f != FunctorGNumber) {
return FALSE;
}
to = Yap_CopyTerm(RepAppl(t)[1]);
return Yap_unify(to, ARG2);
return Yap_unify(ArgOfTerm(1,t), ARG2);
}

View File

@ -102,8 +102,9 @@ typedef greg_t context_reg;
#else
#define CONTEXT_PC NULL
#define CONTEXT_BP NULL
#ifdef LOW_PROF
#undef LOW_PROF
#endif
#endif

View File

@ -2004,6 +2004,7 @@ mark_choicepoints(register choiceptr gc_B, tr_fr_ptr saved_TR, int very_verbose
#endif /* TABLING */
op = rtp->opc;
opnum = Yap_op_from_opcode(op);
// fprintf(stderr, "%s\n", Yap_op_names[opnum]);
#ifdef TABLING
}
if (aux_sg_fr && gc_B == SgFr_gen_cp(aux_sg_fr)) {
@ -2166,11 +2167,37 @@ mark_choicepoints(register choiceptr gc_B, tr_fr_ptr saved_TR, int very_verbose
case _table_answer_resolution:
{
CELL *vars_ptr, vars;
init_substitution_pointer(gc_B, vars_ptr, CONS_CP(gc_B)->cp_dep_fr);
vars = *vars_ptr++;
while (vars--) {
mark_external_reference(vars_ptr PASS_REGS);
vars_ptr++;
dep_fr_ptr dep_fr = CONS_CP(gc_B)->cp_dep_fr;
ans_node_ptr ans_node = DepFr_last_answer(dep_fr);
if (TrNode_child(ans_node)) {
/* unconsumed answers */
#ifdef MODE_DIRECTED_TABLING
if (IS_ANSWER_INVALID_NODE(TrNode_child(ans_node))) {
ans_node_ptr old_ans_node;
old_ans_node = ans_node;
ans_node = TrNode_child(ans_node);
do {
ans_node = TrNode_child(ans_node);
} while (IS_ANSWER_INVALID_NODE(ans_node));
TrNode_child(old_ans_node) = ans_node;
} else
#endif /* MODE_DIRECTED_TABLING */
ans_node = TrNode_child(ans_node);
if (gc_B == DepFr_leader_cp(dep_fr)) { \
/* gc_B is a generator-consumer node */ \
/* never here if batched scheduling */ \
TABLING_ERROR_CHECKING(generator_consumer, IS_BATCHED_GEN_CP(gc_B)); \
vars_ptr = (CELL *) (GEN_CP(gc_B) + 1); \
vars_ptr += SgFr_arity(GEN_CP(gc_B)->cp_sg_fr); \
} else { \
vars_ptr = (CELL *) (CONS_CP(gc_B) + 1); \
} \
vars = *vars_ptr++;
while (vars--) {
mark_external_reference(vars_ptr PASS_REGS);
vars_ptr++;
}
}
}
nargs = 0;
@ -3113,18 +3140,43 @@ sweep_choicepoints(choiceptr gc_B USES_REGS)
case _table_answer_resolution:
{
CELL *vars_ptr, vars;
sweep_environments(gc_B->cp_env, EnvSize(gc_B->cp_cp), EnvBMap(gc_B->cp_cp) PASS_REGS);
init_substitution_pointer(gc_B, vars_ptr, CONS_CP(gc_B)->cp_dep_fr);
vars = *vars_ptr++;
while (vars--) {
CELL cp_cell = *vars_ptr;
if (MARKED_PTR(vars_ptr)) {
UNMARK(vars_ptr);
if (HEAP_PTR(cp_cell)) {
into_relocation_chain(vars_ptr, GET_NEXT(cp_cell) PASS_REGS);
}
dep_fr_ptr dep_fr = CONS_CP(gc_B)->cp_dep_fr;
ans_node_ptr ans_node = DepFr_last_answer(dep_fr);
if (TrNode_child(ans_node)) {
/* unconsumed answers */
#ifdef MODE_DIRECTED_TABLING
if (IS_ANSWER_INVALID_NODE(TrNode_child(ans_node))) {
ans_node_ptr old_ans_node;
old_ans_node = ans_node;
ans_node = TrNode_child(ans_node);
do {
ans_node = TrNode_child(ans_node);
} while (IS_ANSWER_INVALID_NODE(ans_node));
TrNode_child(old_ans_node) = ans_node;
} else
#endif /* MODE_DIRECTED_TABLING */
ans_node = TrNode_child(ans_node);
if (gc_B == DepFr_leader_cp(dep_fr)) { \
/* gc_B is a generator-consumer node */
/* never here if batched scheduling */
TABLING_ERROR_CHECKING(generator_consumer, IS_BATCHED_GEN_CP(gc_B));
vars_ptr = (CELL *) (GEN_CP(gc_B) + 1);
vars_ptr += SgFr_arity(GEN_CP(gc_B)->cp_sg_fr);
} else {
vars_ptr = (CELL *) (CONS_CP(gc_B) + 1); \
}
sweep_environments(gc_B->cp_env, EnvSize(gc_B->cp_cp), EnvBMap(gc_B->cp_cp) PASS_REGS);
vars = *vars_ptr++;
while (vars--) {
CELL cp_cell = *vars_ptr;
if (MARKED_PTR(vars_ptr)) {
UNMARK(vars_ptr);
if (HEAP_PTR(cp_cell)) {
into_relocation_chain(vars_ptr, GET_NEXT(cp_cell) PASS_REGS);
}
}
vars_ptr++;
}
vars_ptr++;
}
}
break;

View File

@ -70,7 +70,7 @@ typedef struct jmp_buff_struct {
static void GNextToken( CACHE_TYPE1 );
static void checkfor(Term, JMPBUFF * CACHE_TYPE);
static Term ParseArgs(Atom, JMPBUFF * CACHE_TYPE);
static Term ParseArgs(Atom, Term, JMPBUFF *, Term CACHE_TYPE);
static Term ParseList(JMPBUFF * CACHE_TYPE);
static Term ParseTerm(int, JMPBUFF * CACHE_TYPE);
@ -324,7 +324,7 @@ checkfor(Term c, JMPBUFF *FailBuff USES_REGS)
}
static Term
ParseArgs(Atom a, JMPBUFF *FailBuff USES_REGS)
ParseArgs(Atom a, Term close, JMPBUFF *FailBuff, Term arg1 USES_REGS)
{
int nargs = 0;
Term *p, t;
@ -335,6 +335,27 @@ ParseArgs(Atom a, JMPBUFF *FailBuff USES_REGS)
NextToken;
p = (Term *) ParserAuxSp;
if (arg1) {
*p = arg1;
nargs++;
ParserAuxSp = (char *)(p+1);
if (LOCAL_tokptr->Tok == Ord(Ponctuation_tok)
&& LOCAL_tokptr->TokInfo == close) {
func = Yap_MkFunctor(a, 1);
if (func == NULL) {
LOCAL_ErrorMessage = "Heap Overflow";
FAIL;
}
t = Yap_MkApplTerm(func, nargs, p);
if (H > ASP-4096) {
LOCAL_ErrorMessage = "Stack Overflow";
return TermNil;
}
NextToken;
return t;
}
}
while (1) {
Term *tp = (Term *)ParserAuxSp;
if (ParserAuxSp+1 > LOCAL_TrailTop) {
@ -380,7 +401,7 @@ ParseArgs(Atom a, JMPBUFF *FailBuff USES_REGS)
return TermNil;
}
/* check for possible overflow against local stack */
checkfor((Term) ')', FailBuff PASS_REGS);
checkfor(close, FailBuff PASS_REGS);
return t;
}
@ -519,7 +540,7 @@ ParseTerm(int prio, JMPBUFF *FailBuff USES_REGS)
}
if (LOCAL_tokptr->Tok == Ord(Ponctuation_tok)
&& Unsigned(LOCAL_tokptr->TokInfo) == 'l')
t = ParseArgs((Atom) t, FailBuff PASS_REGS);
t = ParseArgs((Atom) t, (Term)')', FailBuff, 0L PASS_REGS);
else
t = MkAtomTerm((Atom)t);
break;
@ -710,6 +731,24 @@ ParseTerm(int prio, JMPBUFF *FailBuff USES_REGS)
}
curprio = opprio;
continue;
} else if (Unsigned(LOCAL_tokptr->TokInfo) == '(' &&
IsPosfixOp(AtomEmptyBrackets, &opprio, &oplprio PASS_REGS)
&& opprio <= prio && oplprio >= curprio) {
t = ParseArgs(AtomEmptyBrackets, (Term)')', FailBuff, t PASS_REGS);
curprio = opprio;
continue;
} else if (Unsigned(LOCAL_tokptr->TokInfo) == '[' &&
IsPosfixOp(AtomEmptySquareBrackets, &opprio, &oplprio PASS_REGS)
&& opprio <= prio && oplprio >= curprio) {
t = ParseArgs(AtomEmptySquareBrackets, (Term)']', FailBuff, t PASS_REGS);
curprio = opprio;
continue;
} else if (Unsigned(LOCAL_tokptr->TokInfo) == '{' &&
IsPosfixOp(AtomEmptyCurlyBrackets, &opprio, &oplprio PASS_REGS)
&& opprio <= prio && oplprio >= curprio) {
t = ParseArgs(AtomEmptyCurlyBrackets, (Term)'}', FailBuff, t PASS_REGS);
curprio = opprio;
continue;
}
}
if (LOCAL_tokptr->Tok <= Ord(WString_tok))

View File

@ -320,7 +320,7 @@ wrputf(Float f, struct write_globs *wglb) /* writes a float */
ob = protect_open_number(wglb, last_minus, sgn);
#if THREADS
/* old style writing */
int found_dot = FALSE, found_exp = FALSE;
int found_dot = FALSE;
char *pt = s;
int ch;
@ -348,7 +348,6 @@ wrputf(Float f, struct write_globs *wglb) /* writes a float */
found_dot = TRUE;
wrputs(".0", stream);
}
found_exp = TRUE;
default:
wrputc(ch, stream);
}
@ -751,7 +750,6 @@ check_infinite_loop(Term t, struct rewind_term *x, struct write_globs *wglb)
static void
write_list(Term t, int direction, int depth, struct write_globs *wglb, struct rewind_term *rwt)
{
CACHE_REGS
Term ti;
struct rewind_term nrwt;
nrwt.parent = rwt;
@ -975,7 +973,7 @@ writeTerm(Term t, int p, int depth, int rinfixarg, struct write_globs *wglb, str
wrclose_bracket(wglb, TRUE);
}
} else if (!wglb->Ignore_ops &&
Arity == 1 &&
( Arity == 1 || atom == AtomEmptyBrackets || atom == AtomEmptyCurlyBrackets || atom == AtomEmptySquareBrackets) &&
Yap_IsPosfixOp(atom, &op, &lp)) {
Term tleft = ArgOfTerm(1, t);
@ -995,7 +993,40 @@ writeTerm(Term t, int p, int depth, int rinfixarg, struct write_globs *wglb, str
if (bracket_left) {
wrclose_bracket(wglb, TRUE);
}
putAtom(atom, wglb->Quote_illegal, wglb);
if (Arity > 1) {
if (atom == AtomEmptyBrackets) {
wrputc('(', wglb->stream);
} else if (atom == AtomEmptySquareBrackets) {
wrputc('[', wglb->stream);
} else if (atom == AtomEmptyCurlyBrackets) {
wrputc('{', wglb->stream);
}
lastw = separator;
for (op = 2; op <= Arity; ++op) {
if (op == wglb->MaxArgs) {
wrputc('.', wglb->stream);
wrputc('.', wglb->stream);
wrputc('.', wglb->stream);
break;
}
writeTerm(from_pointer(RepAppl(t)+op, &nrwt, wglb), 999, depth + 1, FALSE, wglb, &nrwt);
restore_from_write(&nrwt, wglb);
if (op != Arity) {
wrputc(',', wglb->stream);
lastw = separator;
}
}
if (atom == AtomEmptyBrackets) {
wrputc(')', wglb->stream);
} else if (atom == AtomEmptySquareBrackets) {
wrputc(']', wglb->stream);
} else if (atom == AtomEmptyCurlyBrackets) {
wrputc('}', wglb->stream);
}
lastw = separator;
} else {
putAtom(atom, wglb->Quote_illegal, wglb);
}
if (op > p) {
wrclose_bracket(wglb, TRUE);
}

View File

@ -101,10 +101,19 @@ typedef void *Atom;
#endif
typedef UInt CELL;
#if HAVE_STDINT_H
#include <stdint.h>
typedef uint16_t BITS16;
typedef int16_t SBITS16;
typedef uint32_t BITS32;
#else
typedef UShort BITS16;
typedef Short SBITS16;
typedef Short SBITS16;
typedef UInt BITS32;
#endif
#define WordSize sizeof(BITS16)
#define CellSize sizeof(CELL)

View File

@ -172,12 +172,13 @@ typedef struct index_t {
UInt nentries;
UInt hsize;
BITS32 *key;
CELL *cls;
CELL *cls, *bcls;
BITS32 *links;
size_t size;
yamop *code;
BITS32 *udi_data;
void *udi_first, *udi_next;
UInt udi_free_args;
UInt udi_arg;
} Index_t;
@ -186,30 +187,30 @@ INLINE_ONLY EXTERN inline BITS32 EXO_ADDRESS_TO_OFFSET(struct index_t *it, CELL
INLINE_ONLY EXTERN inline BITS32
EXO_ADDRESS_TO_OFFSET(struct index_t *it, CELL* ptr)
{
return 1+(ptr-it->cls);
return (ptr-it->cls)/it->arity+1;
}
INLINE_ONLY EXTERN inline CELL *EXO_OFFSET_TO_ADDRESS(struct index_t *it, UInt off);
INLINE_ONLY EXTERN inline CELL *EXO_OFFSET_TO_ADDRESS(struct index_t *it, BITS32 off);
INLINE_ONLY EXTERN inline CELL *
EXO_OFFSET_TO_ADDRESS(struct index_t *it, BITS32 off)
{
if (off == 0L)
return NULL;
return (it->cls-1)+off;
return (it->cls)+(off-1)*it->arity;
}
INLINE_ONLY EXTERN inline BITS32 ADDRESS_TO_LINK(struct index_t *it, CELL *ptr);
INLINE_ONLY EXTERN inline BITS32 ADDRESS_TO_LINK(struct index_t *it, BITS32 *ptr);
INLINE_ONLY EXTERN inline BITS32
ADDRESS_TO_LINK(struct index_t *it, CELL* ptr)
ADDRESS_TO_LINK(struct index_t *it, BITS32* ptr)
{
return ptr-it->links;
}
INLINE_ONLY EXTERN inline CELL *LINK_TO_ADDRESS(struct index_t *it, BITS32 off);
INLINE_ONLY EXTERN inline BITS32 *LINK_TO_ADDRESS(struct index_t *it, BITS32 off);
INLINE_ONLY EXTERN inline CELL *
INLINE_ONLY EXTERN inline BITS32 *
LINK_TO_ADDRESS(struct index_t *it, BITS32 off)
{
return it->links+off;

View File

@ -403,6 +403,8 @@
#define LOCAL_ibnds LOCAL->ibnds_
#define REMOTE_ibnds(wid) REMOTE(wid)->ibnds_
#define LOCAL_exo_it LOCAL->exo_it_
#define REMOTE_exo_it(wid) REMOTE(wid)->exo_it_
#define LOCAL_exo_base LOCAL->exo_base_
#define REMOTE_exo_base(wid) REMOTE(wid)->exo_base_
#define LOCAL_exo_arity LOCAL->exo_arity_

View File

@ -227,7 +227,8 @@ typedef struct worker_local {
Functor FunctorVar_;
UInt ibnds_[256];
void* exo_base_;
struct index_t* exo_it_;
CELL* exo_base_;
UInt exo_arity_;
UInt exo_arg_;

View File

@ -20,6 +20,9 @@
AtomArrayType = Yap_LookupAtom("array_type");
AtomArrow = Yap_LookupAtom("->");
AtomAssert = Yap_LookupAtom(":-");
AtomEmptyBrackets = Yap_LookupAtom("()");
AtomEmptySquareBrackets = Yap_LookupAtom("[]");
AtomEmptyCurlyBrackets = Yap_LookupAtom("{}");
AtomAt = Yap_LookupAtom("at");
AtomAtom = Yap_LookupAtom("atom");
AtomAtomic = Yap_LookupAtom("atomic");
@ -156,6 +159,7 @@
AtomLT = Yap_LookupAtom("<");
AtomLastExecuteWithin = Yap_FullLookupAtom("$last_execute_within");
AtomLeash = Yap_FullLookupAtom("$leash");
AtomLeast = Yap_LookupAtom("least");
AtomLength = Yap_FullLookupAtom("length");
AtomList = Yap_LookupAtom("list");
AtomLive = Yap_FullLookupAtom("$live");
@ -164,14 +168,17 @@
AtomLocalSp = Yap_LookupAtom("local_sp");
AtomLocalTrie = Yap_LookupAtom("local_trie");
AtomMax = Yap_LookupAtom("max");
AtomMaximum = Yap_LookupAtom("maximum");
AtomMaxArity = Yap_LookupAtom("max_arity");
AtomMaxFiles = Yap_LookupAtom("max_files");
AtomMegaClause = Yap_FullLookupAtom("$mega_clause");
AtomMetaCall = Yap_FullLookupAtom("$call");
AtomMfClause = Yap_FullLookupAtom("$mf_clause");
AtomMin = Yap_LookupAtom("min");
AtomMinimum = Yap_LookupAtom("minimum");
AtomMinus = Yap_LookupAtom("-");
AtomModify = Yap_LookupAtom("modify");
AtomMost = Yap_LookupAtom("most");
AtomMultiFile = Yap_FullLookupAtom("$mf");
AtomMutable = Yap_LookupAtom("mutable");
AtomMutableVariable = Yap_FullLookupAtom("$mutable_variable");

View File

@ -227,6 +227,7 @@ static void InitWorker(int wid) {
REMOTE_FunctorVar(wid) = FunctorVar;
REMOTE_exo_it(wid) = NULL;
REMOTE_exo_base(wid) = NULL;
REMOTE_exo_arity(wid) = 0;
REMOTE_exo_arg(wid) = 0;

View File

@ -20,6 +20,9 @@
AtomArrayType = AtomAdjust(AtomArrayType);
AtomArrow = AtomAdjust(AtomArrow);
AtomAssert = AtomAdjust(AtomAssert);
AtomEmptyBrackets = AtomAdjust(AtomEmptyBrackets);
AtomEmptySquareBrackets = AtomAdjust(AtomEmptySquareBrackets);
AtomEmptyCurlyBrackets = AtomAdjust(AtomEmptyCurlyBrackets);
AtomAt = AtomAdjust(AtomAt);
AtomAtom = AtomAdjust(AtomAtom);
AtomAtomic = AtomAdjust(AtomAtomic);
@ -156,6 +159,7 @@
AtomLT = AtomAdjust(AtomLT);
AtomLastExecuteWithin = AtomAdjust(AtomLastExecuteWithin);
AtomLeash = AtomAdjust(AtomLeash);
AtomLeast = AtomAdjust(AtomLeast);
AtomLength = AtomAdjust(AtomLength);
AtomList = AtomAdjust(AtomList);
AtomLive = AtomAdjust(AtomLive);
@ -164,14 +168,17 @@
AtomLocalSp = AtomAdjust(AtomLocalSp);
AtomLocalTrie = AtomAdjust(AtomLocalTrie);
AtomMax = AtomAdjust(AtomMax);
AtomMaximum = AtomAdjust(AtomMaximum);
AtomMaxArity = AtomAdjust(AtomMaxArity);
AtomMaxFiles = AtomAdjust(AtomMaxFiles);
AtomMegaClause = AtomAdjust(AtomMegaClause);
AtomMetaCall = AtomAdjust(AtomMetaCall);
AtomMfClause = AtomAdjust(AtomMfClause);
AtomMin = AtomAdjust(AtomMin);
AtomMinimum = AtomAdjust(AtomMinimum);
AtomMinus = AtomAdjust(AtomMinus);
AtomModify = AtomAdjust(AtomModify);
AtomMost = AtomAdjust(AtomMost);
AtomMultiFile = AtomAdjust(AtomMultiFile);
AtomMutable = AtomAdjust(AtomMutable);
AtomMutableVariable = AtomAdjust(AtomMutableVariable);

View File

@ -230,6 +230,7 @@ static void RestoreWorker(int wid USES_REGS) {
}

View File

@ -38,6 +38,12 @@
#define AtomArrow Yap_heap_regs->AtomArrow_
Atom AtomAssert_;
#define AtomAssert Yap_heap_regs->AtomAssert_
Atom AtomEmptyBrackets_;
#define AtomEmptyBrackets Yap_heap_regs->AtomEmptyBrackets_
Atom AtomEmptySquareBrackets_;
#define AtomEmptySquareBrackets Yap_heap_regs->AtomEmptySquareBrackets_
Atom AtomEmptyCurlyBrackets_;
#define AtomEmptyCurlyBrackets Yap_heap_regs->AtomEmptyCurlyBrackets_
Atom AtomAt_;
#define AtomAt Yap_heap_regs->AtomAt_
Atom AtomAtom_;
@ -310,6 +316,8 @@
#define AtomLastExecuteWithin Yap_heap_regs->AtomLastExecuteWithin_
Atom AtomLeash_;
#define AtomLeash Yap_heap_regs->AtomLeash_
Atom AtomLeast_;
#define AtomLeast Yap_heap_regs->AtomLeast_
Atom AtomLength_;
#define AtomLength Yap_heap_regs->AtomLength_
Atom AtomList_;
@ -326,6 +334,8 @@
#define AtomLocalTrie Yap_heap_regs->AtomLocalTrie_
Atom AtomMax_;
#define AtomMax Yap_heap_regs->AtomMax_
Atom AtomMaximum_;
#define AtomMaximum Yap_heap_regs->AtomMaximum_
Atom AtomMaxArity_;
#define AtomMaxArity Yap_heap_regs->AtomMaxArity_
Atom AtomMaxFiles_;
@ -338,10 +348,14 @@
#define AtomMfClause Yap_heap_regs->AtomMfClause_
Atom AtomMin_;
#define AtomMin Yap_heap_regs->AtomMin_
Atom AtomMinimum_;
#define AtomMinimum Yap_heap_regs->AtomMinimum_
Atom AtomMinus_;
#define AtomMinus Yap_heap_regs->AtomMinus_
Atom AtomModify_;
#define AtomModify Yap_heap_regs->AtomModify_
Atom AtomMost_;
#define AtomMost Yap_heap_regs->AtomMost_
Atom AtomMultiFile_;
#define AtomMultiFile Yap_heap_regs->AtomMultiFile_
Atom AtomMutable_;

View File

@ -14400,7 +14400,8 @@ Letter = 'D',
Number = 123456789 ?
yes
@end example
generates the query @example
generates the query
@example
SELECT A.Letter , 'John Doe' , A.Number
FROM 'phonebook' A
WHERE A.Name = 'John Doe';
@ -14464,7 +14465,8 @@ above. Assuming the declaration:
yes
@end example
we
write:@example
write:
@example
?- db_view(direct_cycle(A,B),(edge(A,B), edge(B,A))).
yes
?- direct_cycle(A,B)).
@ -14472,7 +14474,8 @@ A = 10,
B = 20 ?
@end example
This call generates the SQL
statement: @example
statement:
@example
SELECT A.attr1 , A.attr2
FROM Edge A , Edge B
WHERE B.attr1 = A.attr2 AND B.attr2 = A.attr1;
@ -14897,7 +14900,8 @@ yes
The MySQL C API permits two modes for transferring the data generated by
a query to the client, in our case YAP. The first mode, and the default
mode used by the MYDDAS-MySQL, is to store the result. This mode copies all the
information generated to the client side.@example
information generated to the client side.
@example
?- db_my_result_set(X).
X=store_result
yes
@ -16182,7 +16186,7 @@ loop(Env) :-
loop(NewEnv).
@end example
@end table
@end itemize
@section Deterministic Programs

View File

@ -2265,8 +2265,8 @@ PL_discard_foreign_frame(fid_t f)
LOCAL_execution = env->old;
ASP = LCL0-CurSlot;
B = B->cp_b;
EX = NULL;
LOCAL_BallTerm = EX;
//LOCAL_BallTerm = EX;
//EX = NULL;
free(env);
}
@ -2331,7 +2331,7 @@ X_API void PL_close_query(qid_t qi)
{
CACHE_REGS
EX = NULL;
if (EX && !(qi->flags & (PL_Q_CATCH_EXCEPTION|PL_Q_PASS_EXCEPTION))) {
if (EX && !(qi->flags & (PL_Q_CATCH_EXCEPTION))) {
EX = NULL;
}
/* need to implement backtracking here */

View File

@ -9,13 +9,12 @@
:- module(exo_interval,
[max/2,
min/2,
any/2,
max/1,
min/1,
any/2,
maximum/1,
minimum/1,
any/1,
max/3,
min/3,
any/3,
(#<)/2,
(#>)/2,
(#=<)/2,
@ -27,31 +26,33 @@
op(700, xfx, (#=<)),
op(700, xfx, (#=))]).
:- meta_predicate max(?,0,?), min(?,0,?), any(?,0,?).
:- meta_predicate max(?,0), min(?,0), any(?,0).
max(X, G, X) :-
max(X, G) :-
insert_atts(X, i(_,_,max)),
call(G).
min(X, G, X) :-
min(X, G) :-
insert_atts(X, i(_,_,min)),
call(G).
max(X, X) :-
insert_atts(X, i(_,_,max)).
min(X, X) :-
insert_atts(X, i(_,_,min)).
max(X) :-
insert_atts(X, i(_,_,max)).
maximum(X) :-
insert_atts(X, i(_,_,maximum)).
any(X) :-
insert_atts(X, i(_,_,any)).
min(X) :-
insert_atts(X, i(_,_,min)).
minimum(X) :-
insert_atts(X, i(_,_,minimum)).
least(X) :-
insert_atts(X, i(_,_,least)).
X #> Y :-
( var(X) -> insert_atts(X, i(Y,_,_))

View File

@ -16,6 +16,9 @@
*************************************************************************/
:- module(nb, [
nb_create_accumulator/2,
nb_add_to_accumulator/2,
nb_accumulator_value/2,
nb_queue/1,
nb_queue/2,
nb_queue_close/3,

View File

@ -25,6 +25,9 @@ A ArrayOverflow N "array_overflow"
A ArrayType N "array_type"
A Arrow N "->"
A Assert N ":-"
A EmptyBrackets N "()"
A EmptySquareBrackets N "[]"
A EmptyCurlyBrackets N "{}"
A At N "at"
A Atom N "atom"
A Atomic N "atomic"
@ -161,6 +164,7 @@ A LOOP N "_LOOP_"
A LT N "<"
A LastExecuteWithin F "$last_execute_within"
A Leash F "$leash"
A Least N "least"
A Length F "length"
A List N "list"
A Live F "$live"
@ -169,14 +173,17 @@ A Local N "local"
A LocalSp N "local_sp"
A LocalTrie N "local_trie"
A Max N "max"
A Maximum N "maximum"
A MaxArity N "max_arity"
A MaxFiles N "max_files"
A MegaClause F "$mega_clause"
A MetaCall F "$call"
A MfClause F "$mf_clause"
A Min N "min"
A Minimum N "minimum"
A Minus N "-"
A Modify N "modify"
A Most N "most"
A MultiFile F "$mf"
A Mutable N "mutable"
A MutableVariable F "$mutable_variable"

View File

@ -255,10 +255,11 @@ yamop *ImportFAILCODE =NULL
Functor FunctorVar =FunctorVar
// exo indexingxb
// exo indexing
UInt ibnds[256] void
BITS32* exo_base =NULL
struct index_t* exo_it =NULL
CELL* exo_base =NULL
UInt exo_arity =0
UInt exo_arg =0

View File

@ -162,7 +162,7 @@ process_arg(Sk, Id, _I) -->
% if :: been used before for this skolem
% just keep on using it,
% otherwise, assume it is t,f
( \+ \+ skolem(Sk,_D) -> true ; new_skolem(Sk,[t,f]) ),
( \+ \+ skolem(Sk,_D) -> true ; new_skolem(Sk,[f,t]) ),
assert(skolem_in(Sk, Id))
},
[Sk].

View File

@ -7,7 +7,7 @@
<meta name="originator" content="TeX4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/)">
<!-- html -->
<meta name="src" content="manual.tex">
<meta name="date" content="2011-10-10 19:58:00">
<meta name="date" content="2013-07-16 15:51:00">
<link rel="stylesheet" type="text/css" href="manual.css">
</head><body
>
@ -21,7 +21,7 @@ class="cmr-12">Fabrizio Riguzzi</span>
<br /><span
class="cmr-12">fabrizio.riguzzi@unife.it</span></div><br />
<div class="date" ><span
class="cmr-12">October 10, 2011</span></div>
class="cmr-12">July 16, 2013</span></div>
</div>
<h3 class="sectionHead"><span class="titlemark">1 </span> <a
id="x1-10001"></a>Introduction</h3>
@ -40,13 +40,13 @@ learning.
<!--l. 34--><p class="noindent" ><span
class="cmtt-10">cplint </span>is distributed in source code in the source code development tree of Yap. It
includes Prolog and C files. Download it by following the instruction in <a
href="http://www.ncc.up.pt/\protect \unhbox \voidb@x \penalty \@M \relax \unhbox \voidb@x \special {t4ht@+&{35}x00A0{59}}x{}vsc/Yap/downloads.html" >
http://www.ncc.up.pt/&#x00A0;vsc/Yap/downloads.html </a>.
href="http://www.dcc.fc.up.pt/~vsc/Yap/downloads.html" >
http://www.dcc.fc.up.pt/&#x02DC;vsc/Yap/downloads.html </a>.
<!--l. 36--><p class="indent" > <span
class="cmtt-10">cplint </span>requires <a
href="http://vlsi.colorado.edu/\protect \unhbox \voidb@x \penalty \@M \relax \unhbox \voidb@x \special {t4ht@+&{35}x00A0{59}}x{}fabio/CUDD/" > CUDD </a>. You can download CUDD from <a
href="ftp://vlsi.colorado.edu/pub/cudd-2.4.2.tar.gz" >
ftp://vlsi.colorado.edu/pub/cudd-2.4.2.tar.gz </a>.
href="http://vlsi.colorado.edu/~fabio/CUDD/" > CUDD </a>. You can download CUDD from <a
href="ftp://vlsi.colorado.edu/pub/cudd-2.5.0.tar.gz" >
ftp://vlsi.colorado.edu/pub/cudd-2.5.0.tar.gz </a>.
<!--l. 39--><p class="indent" > Compile CUDD:
<ol class="enumerate1" >
<li
@ -70,7 +70,7 @@ configure&#x00A0;--enable-cplint=DIR
<!--l. 50--><p class="nopar" > where <span class="obeylines-h"><span class="verb"><span
class="cmtt-10">DIR</span></span></span> is the directory where CUDD is, i.e., the directory ending with
<span
class="cmtt-10">cudd-2.4.2</span>. Under Windows, you have to use Cygwin (CUDD does not compile
class="cmtt-10">cudd-2.5.0</span>. Under Windows, you have to use Cygwin (CUDD does not compile
under MinGW), so<br
class="newline" />
@ -160,7 +160,7 @@ average/2
</div>
<!--l. 114--><p class="nopar" > that, given a list of numbers, computes its arithmetic mean.
<!--l. 117--><p class="indent" > The syntax of ICL program is the one used by the <a
href="http://www.cs.ubc.ca/\protect \unhbox \voidb@x \penalty \@M \relax \unhbox \voidb@x \special {t4ht@+&{35}x00A0{59}}x{}poole/aibook/code/ailog/ailog2.html" > AILog 2 </a> system.
href="http://www.cs.ubc.ca/~poole/aibook/code/ailog/ailog2.html" > AILog 2 </a> system.
<h3 class="sectionHead"><span class="titlemark">4 </span> <a
id="x1-40004"></a>Inference</h3>
<!--l. 119--><p class="noindent" ><span
@ -244,7 +244,7 @@ href="#XRig11-CILC11-NC">17</a>]</span></li></ul>
class="cmtt-10">approx/exact.pl </span>as <span
class="cmtt-10">lpadsld.pl </span>but uses SimplecuddLPADs, a modification
of the <a
href="www.cs.kuleuven.be/\protect \unhbox \voidb@x \penalty \@M \relax \unhbox \voidb@x \special {t4ht@+&{35}x00A0{59}}x{}theo/tools/simplecudd.html" > Simplecudd </a> instead of the <span
href="http://dtai.cs.kuleuven.be/problog/download.html" > Simplecudd </a> instead of the <span
class="cmtt-10">cplint </span>library for building BDDs and
computing the probability.</li></ul>
<!--l. 149--><p class="indent" > These modules answer queries using the definition of the semantics of LPADs and
@ -505,7 +505,7 @@ class="cmtt-10">X=1,X1=0 </span>and variable <span
class="cmtt-10">X2 </span>corresponds to clause <span
class="cmtt-10">1 </span>with the
empty substitution. You can view the graph with <a
href="www.graphviz.org" > <span
href="http://www.graphviz.org" > <span
class="cmtt-10">graphviz </span></a> using the
command
@ -1039,7 +1039,7 @@ unseen(&#x003C;predicate&#x003E;/&#x003C;arity&#x003E;).
<!--l. 504--><p class="nopar" >
<!--l. 506--><p class="indent" > For SLIPCASE, you have to specify the language bias by means of mode
declarations in the style of <a
href="http://www.doc.ic.ac.uk/\protect \unhbox \voidb@x \penalty \@M \relax \unhbox \voidb@x \special {t4ht@+&{35}x00A0{59}}x{}shm/progol.html" > Progol </a>.
href="http://www.doc.ic.ac.uk/~shm/progol.html" > Progol </a>.
<div class="verbatim" id="verbatim-42">
modeh(&#x003C;recall&#x003E;,&#x003C;predicate&#x003E;(&#x003C;arg1&#x003E;,...).
@ -1071,17 +1071,37 @@ class="cmtt-10">&#x003C;type&#x003E;</span>. or
&#x003C;constant&#x003E;
</div>
<!--l. 529--><p class="nopar" > for specifying a constant.
<!--l. 532--><p class="noindent" >
<!--l. 532--><p class="indent" > An example of language bias for the UWCSE domain is
<div class="verbatim" id="verbatim-47">
output(advisedby/2).
&#x00A0;<br />
&#x00A0;<br />input(student/1).
&#x00A0;<br />input(professor/1).
&#x00A0;<br />....
&#x00A0;<br />
&#x00A0;<br />modeh(*,advisedby(+person,+person)).
&#x00A0;<br />
&#x00A0;<br />modeb(*,professor(+person)).
&#x00A0;<br />modeb(*,student(+person)).
&#x00A0;<br />modeb(*,sameperson(+person,&#x00A0;-person)).
&#x00A0;<br />modeb(*,sameperson(-person,&#x00A0;+person)).
&#x00A0;<br />modeb(*,samecourse(+course,&#x00A0;-course)).
&#x00A0;<br />modeb(*,samecourse(-course,&#x00A0;+course)).
&#x00A0;<br />....
</div>
<!--l. 549--><p class="nopar" >
<!--l. 551--><p class="noindent" >
<h4 class="subsectionHead"><span class="titlemark">5.2 </span> <a
id="x1-120005.2"></a>Parameters</h4>
<!--l. 533--><p class="noindent" >In order to set the algorithms&#8217; parameters, you have to insert in <span
<!--l. 552--><p class="noindent" >In order to set the algorithms&#8217; parameters, you have to insert in <span
class="cmtt-10">&#x003C;stem&#x003E;.l </span>commands
of the form
<div class="verbatim" id="verbatim-47">
<div class="verbatim" id="verbatim-48">
:-&#x00A0;set(&#x003C;parameter&#x003E;,&#x003C;value&#x003E;).
</div>
<!--l. 536--><p class="nopar" > The available parameters are:
<!--l. 555--><p class="nopar" > The available parameters are:
<ul class="itemize1">
<li class="itemize"><span class="obeylines-h"><span class="verb"><span
class="cmtt-10">depth</span></span></span> (values: integer or <span class="obeylines-h"><span class="verb"><span
@ -1228,70 +1248,79 @@ class="cmtt-10">verbosity</span></span></span> (values: integer in [1,3], defaul
class="cmtt-10">beamsize</span></span></span> (values: integer, default value: 20, valid for SLIPCASE): size of
the beam in SLIPCASE
</li></ul>
<!--l. 571--><p class="noindent" >
<!--l. 590--><p class="noindent" >
<h4 class="subsectionHead"><span class="titlemark">5.3 </span> <a
id="x1-130005.3"></a>Commands</h4>
<!--l. 572--><p class="noindent" >To execute CEM, load <span
<!--l. 591--><p class="noindent" >To execute CEM, load <span
class="cmtt-10">em.pl </span>with
<div class="verbatim" id="verbatim-48">
<div class="verbatim" id="verbatim-49">
?:-&#x00A0;use_module(library(&#8217;cplint/em&#8217;)).
</div>
<!--l. 575--><p class="nopar" > and call:
<div class="verbatim" id="verbatim-49">
?:-&#x00A0;em(stem).
</div>
<!--l. 579--><p class="nopar" > To execute RIB, load <span
class="cmtt-10">rib.pl </span>with
<!--l. 594--><p class="nopar" > and call:
<div class="verbatim" id="verbatim-50">
?:-&#x00A0;use_module(library(&#8217;cplint/rib&#8217;)).
</div>
<!--l. 583--><p class="nopar" > and call:
<div class="verbatim" id="verbatim-51">
?:-&#x00A0;ib_par(stem).
</div>
<!--l. 587--><p class="nopar" > To execute EMBLEM, load <span
class="cmtt-10">slipcase.pl </span>with
<div class="verbatim" id="verbatim-52">
?:-&#x00A0;use_module(library(&#8217;cplint/slipcase&#8217;)).
</div>
<!--l. 591--><p class="nopar" > and call
<div class="verbatim" id="verbatim-53">
?:-&#x00A0;em(stem).
</div>
<!--l. 595--><p class="nopar" > To execute SLIPCASE, load <span
<!--l. 598--><p class="nopar" > To execute RIB, load <span
class="cmtt-10">rib.pl </span>with
<div class="verbatim" id="verbatim-51">
?:-&#x00A0;use_module(library(&#8217;cplint/rib&#8217;)).
</div>
<!--l. 602--><p class="nopar" > and call:
<div class="verbatim" id="verbatim-52">
?:-&#x00A0;ib_par(stem).
</div>
<!--l. 606--><p class="nopar" > To execute EMBLEM, load <span
class="cmtt-10">slipcase.pl </span>with
<div class="verbatim" id="verbatim-54">
<div class="verbatim" id="verbatim-53">
?:-&#x00A0;use_module(library(&#8217;cplint/slipcase&#8217;)).
</div>
<!--l. 599--><p class="nopar" > and call
<!--l. 610--><p class="nopar" > and call
<div class="verbatim" id="verbatim-54">
?:-&#x00A0;em(stem).
</div>
<!--l. 614--><p class="nopar" > To execute SLIPCASE, load <span
class="cmtt-10">slipcase.pl </span>with
<div class="verbatim" id="verbatim-55">
?:-&#x00A0;use_module(library(&#8217;cplint/slipcase&#8217;)).
</div>
<!--l. 618--><p class="nopar" > and call
<div class="verbatim" id="verbatim-56">
?:-&#x00A0;sl(stem).
</div>
<!--l. 603--><p class="nopar" >
<!--l. 605--><p class="noindent" >
<!--l. 622--><p class="nopar" >
<h4 class="subsectionHead"><span class="titlemark">5.4 </span> <a
id="x1-140005.4"></a>Learning Examples</h4>
<!--l. 624--><p class="noindent" >The subfolders <span class="obeylines-h"><span class="verb"><span
class="cmtt-10">em</span></span></span>, <span class="obeylines-h"><span class="verb"><span
class="cmtt-10">rib</span></span></span> and <span class="obeylines-h"><span class="verb"><span
class="cmtt-10">slipcase</span></span></span> of the <span class="obeylines-h"><span class="verb"><span
class="cmtt-10">packages/cplint</span></span></span> folder in Yap
git distribution contain examples of input and output files for the learning
algorithms.
<!--l. 627--><p class="noindent" >
<h3 class="sectionHead"><span class="titlemark">6 </span> <a
id="x1-140006"></a>License</h3>
<!--l. 610--><p class="noindent" ><span
id="x1-150006"></a>License</h3>
<!--l. 632--><p class="noindent" ><span
class="cmtt-10">cplint</span>, as Yap, follows the Artistic License 2.0 that you can find in Yap CVS root
dir. The copyright is by Fabrizio Riguzzi.
<!--l. 613--><p class="indent" > The modules in the approx subdirectory use SimplecuddLPADs, a modification of
<!--l. 635--><p class="indent" > The modules in the approx subdirectory use SimplecuddLPADs, a modification of
the <a
href="www.cs.kuleuven.be/\protect \unhbox \voidb@x \penalty \@M \relax \unhbox \voidb@x \special {t4ht@+&{35}x00A0{59}}x{}theo/tools/simplecudd.html" > Simplecudd </a> library whose copyright is by Katholieke Universiteit Leuven and
href="http://dtai.cs.kuleuven.be/problog/download.html" > Simplecudd </a> library whose copyright is by Katholieke Universiteit Leuven and
that follows the Artistic License 2.0.
<!--l. 616--><p class="indent" > Some modules use the library <a
href="http://vlsi.colorado.edu/\protect \unhbox \voidb@x \penalty \@M \relax \unhbox \voidb@x \special {t4ht@+&{35}x00A0{59}}x{}fabio/" > CUDD </a> for manipulating BDDs that is included in
<!--l. 638--><p class="indent" > Some modules use the library <a
href="http://vlsi.colorado.edu/~fabio/" > CUDD </a> for manipulating BDDs that is included in
glu. For the use of CUDD, the following license must be accepted:
<!--l. 621--><p class="indent" > Copyright (c) 1995-2004, Regents of the University of Colorado
<!--l. 623--><p class="indent" > All rights reserved.
<!--l. 625--><p class="indent" > Redistribution and use in source and binary forms, with or without modification,
<!--l. 643--><p class="indent" > Copyright (c) 1995-2004, Regents of the University of Colorado
<!--l. 645--><p class="indent" > All rights reserved.
<!--l. 647--><p class="indent" > Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
<ul class="itemize1">
<li class="itemize">Redistributions of source code must retain the above copyright notice, this
@ -1304,14 +1333,14 @@ are permitted provided that the following conditions are met:
<li class="itemize">Neither the name of the University of Colorado nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.</li></ul>
<!--l. 642--><p class="noindent" >THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS <br
<!--l. 664--><p class="noindent" >THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS <br
class="newline" />AND CONTRIBUTORS &#8221;AS IS&#8221; AND ANY EXPRESS OR IMPLIED
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAU-SED <br
@ -1319,18 +1348,17 @@ class="newline" />AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<!--l. 656--><p class="indent" > <span
<!--l. 678--><p class="indent" > <span
class="cmtt-10">lpad.pl</span>, <span
class="cmtt-10">semlpad.pl </span>and <span
class="cmtt-10">cpl.pl </span>are based on the SLG system by <a
href="http://engr.smu.edu/\protect \unhbox \voidb@x \penalty \@M \relax \unhbox \voidb@x \special {t4ht@+&{35}x00A0{59}}x{}wchen/" > Weidong
Chen </a> and <a
href="http://www.cs.sunysb.edu/\protect \unhbox \voidb@x \penalty \@M \relax \unhbox \voidb@x \special {t4ht@+&{35}x00A0{59}}x{}warren/" > David Scott Warren </a>, Copyright (C) 1993 Southern Methodist University,
class="cmtt-10">cpl.pl </span>are based on the SLG system by Weidong
Chen and <a
href="http://www.cs.sunysb.edu/~warren/" > David Scott Warren </a>, Copyright (C) 1993 Southern Methodist University,
1993 SUNY at Stony Brook, see the file COYPRIGHT_SLG for detailed information
on this copyright.
<!--l. 1--><p class="noindent" >
<h3 class="likesectionHead"><a
id="x1-150006"></a>References</h3>
id="x1-160006"></a>References</h3>
<!--l. 1--><p class="noindent" >
<div class="thebibliography">
<p class="bibitem" ><span class="biblabel">
@ -1358,6 +1386,7 @@ class="cmti-10">31-2 September, 2011</span>, 2011.
<p class="bibitem" ><span class="biblabel">
[4]<span class="bibsp">&#x00A0;&#x00A0;&#x00A0;</span></span><a
id="XBelRig11-ILP11-IC"></a>Elena Bellodi and Fabrizio Riguzzi. Learning the structure of
probabilistic logic programs. In <span
class="cmti-10">Inductive Logic Programming, 21th</span>
<span
@ -1367,7 +1396,6 @@ class="cmti-10">International Conference, ILP 2011, London, UK, 31 July-3 August
<p class="bibitem" ><span class="biblabel">
[5]<span class="bibsp">&#x00A0;&#x00A0;&#x00A0;</span></span><a
id="XBelRig11-IDA"></a>Elena Bellodi and Fabrizio Riguzzi. Expectation Maximization over
binary decision diagrams for probabilistic logic programs. <span
class="cmti-10">Intel. Data Anal.</span>,
16(6), 2012.
@ -1418,6 +1446,7 @@ class="cmti-10">Journal of Machine Learning Research</span>,
probabilistic relational models. In Saso Dzeroski and Nada Lavrac, editors,
<span
class="cmti-10">Relational Data Mining</span>. Springer-Verlag, Berlin, 2001.
</p>
<p class="bibitem" ><span class="biblabel">
[12]<span class="bibsp">&#x00A0;&#x00A0;&#x00A0;</span></span><a
@ -1426,7 +1455,6 @@ class="cmti-10">Relational Data Mining</span>. Springer-Verlag, Berlin, 2001.
class="cmti-10">Journal of Machine Learning</span>
<span
class="cmti-10">Research</span>, 3:679&#8211;707, December 2002.
</p>
<p class="bibitem" ><span class="biblabel">
[13]<span class="bibsp">&#x00A0;&#x00A0;&#x00A0;</span></span><a
@ -1483,6 +1511,7 @@ src="cmsy10-4e.png" alt="N" class="10x-x-4e" /></span>):
class="cmti-10">Uncertainty</span>
<span
class="cmti-10">in Artificial Intelligence</span>. Morgan Kaufmann, 2003.
</p>
<p class="bibitem" ><span class="biblabel">
[20]<span class="bibsp">&#x00A0;&#x00A0;&#x00A0;</span></span><a
@ -1492,7 +1521,6 @@ class="cmti-10">Proceedings of the 10th</span>
<span
class="cmti-10">European Conference on Logics in Artificial Intelligence</span>, LNAI. Springer,
September 2006.
</p>
<p class="bibitem" ><span class="biblabel">
[21]<span class="bibsp">&#x00A0;&#x00A0;&#x00A0;</span></span><a

Binary file not shown.

View File

@ -31,10 +31,10 @@ fabrizio.riguzzi@unife.it}
\texttt{cplint} is a suite of programs for reasoning with ICL \cite{DBLP:journals/ai/Poole97}, LPADs \cite{VenVer03-TR,VenVer04-ICLP04-IC} and CP-logic programs \cite{VenDenBru-JELIA06,DBLP:journals/tplp/VennekensDB09}. It contains programs both for inference and learning.
\section{Installation}
\texttt{cplint} is distributed in source code in the source code development tree of Yap. It includes Prolog and C files. Download it by following the instruction in \url{http://www.ncc.up.pt/~vsc/Yap/downloads.html}.
\texttt{cplint} is distributed in source code in the source code development tree of Yap. It includes Prolog and C files. Download it by following the instruction in \url{http://www.dcc.fc.up.pt/\string ~vsc/Yap/downloads.html}.
\texttt{cplint} requires \href{http://vlsi.colorado.edu/~fabio/CUDD/}{CUDD}.
You can download CUDD from \url{ftp://vlsi.colorado.edu/pub/cudd-2.4.2.tar.gz}.
\texttt{cplint} requires \href{http://vlsi.colorado.edu/\string ~fabio/CUDD/}{CUDD}.
You can download CUDD from \url{ftp://vlsi.colorado.edu/pub/cudd-2.5.0.tar.gz}.
Compile CUDD:
\begin{enumerate}
@ -48,7 +48,7 @@ when compiling Yap following the instruction of the \texttt{INSTALL} file in the
\begin{verbatim}
configure --enable-cplint=DIR
\end{verbatim}
where \verb|DIR| is the directory where CUDD is, i.e., the directory ending with \texttt{cudd-2.4.2}.
where \verb|DIR| is the directory where CUDD is, i.e., the directory ending with \texttt{cudd-2.5.0}.
Under Windows, you have to use Cygwin (CUDD does not compile under MinGW), so\\
\begin{verbatim}
configure --enable-cplint=DIR --enable-cygwin
@ -114,7 +114,7 @@ average/2
\end{verbatim}
that, given a list of numbers, computes its arithmetic mean.
The syntax of ICL program is the one used by the \href{http://www.cs.ubc.ca/~poole/aibook/code/ailog/ailog2.html}{AILog 2} system.
The syntax of ICL program is the one used by the \href{http://www.cs.ubc.ca/\string ~poole/aibook/code/ailog/ailog2.html}{AILog 2} system.
\section{Inference}
\texttt{cplint} contains various modules for answering queries.
@ -143,7 +143,7 @@ It is also able to deal with extensions of LPADs and CP-logic: the clause bodies
\item \texttt{montecarlo.pl} performs Monte Carlo \cite{BraRig10-ILP10-IC}
\item \texttt{mcintyre.pl}: implements the algorithm MCINTYRE (Monte Carlo INference wiTh Yap REcord) \cite{Rig11-CILC11-NC}
\end{itemize}
\item \texttt{approx/exact.pl} as \texttt{lpadsld.pl} but uses SimplecuddLPADs, a modification of the \href{www.cs.kuleuven.be/~theo/tools/simplecudd.html}{Simplecudd} instead of the \texttt{cplint} library for building BDDs and computing the probability.
\item \texttt{approx/exact.pl} as \texttt{lpadsld.pl} but uses SimplecuddLPADs, a modification of the \href{http://dtai.cs.kuleuven.be/problog/download.html}{Simplecudd} instead of the \texttt{cplint} library for building BDDs and computing the probability.
\end{itemize}
These modules answer queries using the definition of the semantics of LPADs and CP-logic:
@ -268,7 +268,7 @@ Variables: [(2,[X=2,X1=1]),(2,[X=1,X1=0]),(1,[])]
In the example above variable \texttt{X0} corresponds to clause \texttt{2} with the substitutions \texttt{X=2,X1=1},
variable \texttt{X1} corresponds to clause \texttt{2} with the substitutions \texttt{X=1,X1=0} and
variable \texttt{X2} corresponds to clause \texttt{1} with the empty substitution.
You can view the graph with \href{www.graphviz.org}{\texttt{graphviz}} using the
You can view the graph with \href{http://www.graphviz.org}{\texttt{graphviz}} using the
command
\begin{verbatim}
dotty cpl.dot &
@ -504,7 +504,7 @@ unseen(<predicate>/<arity>).
\end{verbatim}
For SLIPCASE, you have to specify the language bias by means of mode declarations in the style of
\href{http://www.doc.ic.ac.uk/~shm/progol.html}{Progol}.
\href{http://www.doc.ic.ac.uk/\string ~shm/progol.html}{Progol}.
\begin{verbatim}
modeh(<recall>,<predicate>(<arg1>,...).
\end{verbatim}
@ -529,6 +529,25 @@ for specifying an output variable of type \texttt{<type>}. or
\end{verbatim}
for specifying a constant.
An example of language bias for the UWCSE domain is
\begin{verbatim}
output(advisedby/2).
input(student/1).
input(professor/1).
....
modeh(*,advisedby(+person,+person)).
modeb(*,professor(+person)).
modeb(*,student(+person)).
modeb(*,sameperson(+person, -person)).
modeb(*,sameperson(-person, +person)).
modeb(*,samecourse(+course, -course)).
modeb(*,samecourse(-course, +course)).
....
\end{verbatim}
\subsection{Parameters}
In order to set the algorithms' parameters, you have to insert in \texttt{<stem>.l} commands of the form
\begin{verbatim}
@ -601,6 +620,9 @@ and call
\begin{verbatim}
?:- sl(stem).
\end{verbatim}
\subsection{Learning Examples}
The subfolders \verb|em|, \verb|rib| and \verb|slipcase| of the \verb|packages/cplint| folder in Yap git distribution
contain examples of input and output files for the learning algorithms.
\section{License}
\label{license}
@ -610,10 +632,10 @@ and call
\texttt{cplint}, as Yap, follows the Artistic License 2.0 that you can find in Yap CVS root dir. The copyright is by Fabrizio Riguzzi.
\vspace{3mm}
The modules in the approx subdirectory use SimplecuddLPADs, a modification of the \href{www.cs.kuleuven.be/~theo/tools/simplecudd.html}{Simplecudd} library whose copyright is by Katholieke Universiteit Leuven and that follows the Artistic License 2.0.
The modules in the approx subdirectory use SimplecuddLPADs, a modification of the \href{http://dtai.cs.kuleuven.be/problog/download.html}{Simplecudd} library whose copyright is by Katholieke Universiteit Leuven and that follows the Artistic License 2.0.
\vspace{3mm}
Some modules use the library \href{http://vlsi.colorado.edu/~fabio/}{CUDD} for manipulating BDDs that is included in glu.
Some modules use the library \href{http://vlsi.colorado.edu/\string ~fabio/}{CUDD} for manipulating BDDs that is included in glu.
For the use of CUDD, the following license must be accepted:
\vspace{3mm}
@ -654,7 +676,7 @@ ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
\texttt{lpad.pl}, \texttt{semlpad.pl} and \texttt{cpl.pl} are based on the SLG system
by \href{http://engr.smu.edu/~wchen/}{Weidong Chen} and \href{http://www.cs.sunysb.edu/~warren/}{David Scott Warren},
by Weidong Chen and \href{http://www.cs.sunysb.edu/\string ~warren/}{David Scott Warren},
Copyright (C) 1993 Southern Methodist University, 1993 SUNY at Stony Brook, see the file COYPRIGHT\_SLG for detailed information on this copyright.
\bibliographystyle{plain}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 724 B

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@ -0,0 +1,2 @@
advisedby(X,Y):0.5.
advisedby(X,Y):0.5.

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,157 @@
output(advisedby/2).
input(student/1).
input(professor/1).
input(inphase/2).
input(hasposition/2).
input(publication/2).
input(yearsinprogram/2).
input(taughtby/3).
input(ta/3).
input(courselevel/2).
input(tempadvisedby/2).
input(projectmember/2).
input(sameperson/2).
input(samecourse/2).
input(sameproject/2).
modeh(*,advisedby(+person,+person)).
modeb(*,professor(+person)).
modeb(*,student(+person)).
modeb(*,sameperson(+person, -person)).
modeb(*,sameperson(-person, +person)).
modeb(*,samecourse(+course, -course)).
modeb(*,samecourse(-course, +course)).
modeb(*,sameproject(-project, +project)).
modeb(*,sameproject(+project, -project)).
modeb(*,publication(+title, -person)).
modeb(*,courselevel(+course, -level)).
modeb(*,hasposition(+person, -position)).
%modeb(*,projectmember(+project, -person)).
modeb(*,projectmember(project119, +person)).
modeb(*,projectmember(project130, +person)).
modeb(*,projectmember(project152, +person)).
modeb(*,projectmember(project62, +person)).
modeb(*,projectmember(project94, +person)).
modeb(*,inphase(+person, -phase)).
modeb(*,tempadvisedby(+person, -person)).
modeb(*,yearsinprogram(+person, -integer)).
modeb(*,publication(-title, +person)).
%modeb(*,courselevel(-course, +level)).
modeb(*,courselevel(+course, level_500)).
modeb(*,courselevel(+course, level_400)).
modeb(*,courselevel(+course, level_300)).
%modeb(*,hasposition(-person, +position)).
modeb(*,hasposition(+person, faculty)).
modeb(*,hasposition(+person, faculty_affiliate)).
modeb(*,hasposition(+person, faculty_adjunct)).
modeb(*,hasposition(+person, faculty_visiting)).
modeb(*,hasposition(+person, faculty_emeritus)).
modeb(*,projectmember(-project, +person)).
%modeb(*,inphase(-person, +phase)).
modeb(*,inphase(+person, post_quals)).
modeb(*,inphase(+person, post_generals)).
modeb(*,inphase(+person, pre_quals)).
modeb(*,tempadvisedby(-person, +person)).
%modeb(*,yearsinprogram(-person, +integer)).
modeb(*,yearsinprogram(+person, year_1)).
modeb(*,yearsinprogram(+person, year_2)).
modeb(*,yearsinprogram(+person, year_3)).
modeb(*,yearsinprogram(+person, year_4)).
modeb(*,yearsinprogram(+person, year_5)).
modeb(*,yearsinprogram(+person, year_6)).
modeb(*,yearsinprogram(+person, year_7)).
modeb(*,yearsinprogram(+person, year_8)).
modeb(*,yearsinprogram(+person, year_9)).
modeb(*,yearsinprogram(+person, year_10)).
modeb(*,yearsinprogram(+person, year_12)).
modeb(*,taughtby(+course, -person, -quarter)).
modeb(*,ta(+course, -person, -quarter)).
modeb(*,taughtby(-course, +person, -quarter)).
modeb(*,ta(-course, +person, -quarter)).
%modeb(*,taughtby(-course, -person, +quarter)).
%modeb(*,ta(-course, -person, +quarter)).
modeb(*,taughtby(+course, +person, -quarter)).
modeb(*,ta(+course, +person, -quarter)).
%modeb(*,taughtby(+course, -person, +quarter)).
%modeb(*,ta(+course, -person, +quarter)).
modeb(*,taughtby(+course, -person, autumn_0001)).
modeb(*,ta(+course, -person, autumn_0001)).
modeb(*,taughtby(+course, -person, autumn_0102)).
modeb(*,ta(+course, -person, autumn_0102)).
modeb(*,taughtby(+course, -person, autumn_0203)).
modeb(*,ta(+course, -person, autumn_0203)).
modeb(*,taughtby(+course, -person, autumn_0304)).
modeb(*,ta(+course, -person, autumn_0304)).
modeb(*,taughtby(+course, -person, spring_0001)).
modeb(*,ta(+course, -person, spring_0001)).
modeb(*,taughtby(+course, -person, spring_0102)).
modeb(*,ta(+course, -person, spring_0102)).
modeb(*,taughtby(+course, -person, spring_0203)).
modeb(*,ta(+course, -person, spring_0203)).
modeb(*,taughtby(+course, -person, spring_0304)).
modeb(*,ta(+course, -person, spring_0304)).
modeb(*,taughtby(+course, -person, summer_0102)).
modeb(*,ta(+course, -person, summer_0102)).
modeb(*,taughtby(+course, -person, summer_0203)).
modeb(*,ta(+course, -person, summer_0203)).
modeb(*,taughtby(+course, -person, winter_0001)).
modeb(*,ta(+course, -person, winter_0001)).
modeb(*,taughtby(+course, -person, winter_0102)).
modeb(*,ta(+course, -person, winter_0102)).
modeb(*,taughtby(+course, -person, winter_0203)).
modeb(*,ta(+course, -person, winter_0203)).
modeb(*,taughtby(+course, -person, winter_0304)).
modeb(*,ta(+course, -person, winter_0304)).
%modeb(*,taughtby(-course, +person, +quarter)).
%modeb(*,ta(-course, +person, +quarter)).
modeb(*,taughtby(-course, +person, autumn_0001)).
modeb(*,ta(-course, +person, autumn_0001)).
modeb(*,taughtby(-course, +person, autumn_0102)).
modeb(*,ta(-course, +person, autumn_0102)).
modeb(*,taughtby(-course, +person, autumn_0203)).
modeb(*,ta(-course, +person, autumn_0203)).
modeb(*,taughtby(-course, +person, autumn_0304)).
modeb(*,ta(-course, +person, autumn_0304)).
modeb(*,taughtby(-course, +person, spring_0001)).
modeb(*,ta(-course, +person, spring_0001)).
modeb(*,taughtby(-course, +person, spring_0102)).
modeb(*,ta(-course, +person, spring_0102)).
modeb(*,taughtby(-course, +person, spring_0203)).
modeb(*,ta(-course, +person, spring_0203)).
modeb(*,taughtby(-course, +person, spring_0304)).
modeb(*,ta(-course, +person, spring_0304)).
modeb(*,taughtby(-course, +person, summer_0102)).
modeb(*,ta(-course, +person, summer_0102)).
modeb(*,taughtby(-course, +person, summer_0203)).
modeb(*,ta(-course, +person, summer_0203)).
modeb(*,taughtby(-course, +person, winter_0001)).
modeb(*,ta(-course, +person, winter_0001)).
modeb(*,taughtby(-course, +person, winter_0102)).
modeb(*,ta(-course, +person, winter_0102)).
modeb(*,taughtby(-course, +person, winter_0203)).
modeb(*,ta(-course, +person, winter_0203)).
modeb(*,taughtby(-course, +person, winter_0304)).
modeb(*,ta(-course, +person, winter_0304)).

View File

@ -0,0 +1,34 @@
/* SLIPCASE Final CLL -0.461865
Execution time 100.887000
setting(epsilon_em,0.0001).
setting(epsilon_em_fraction,1.0e-5).
setting(eps,0.0001).
setting(eps_f,1.0e-5).
setting(epsilon_sem,2).
setting(random_restarts_REFnumber,1).
setting(random_restarts_number,1).
setting(iterREF,-1).
setting(iter,-1).
setting(examples,atoms).
setting(group,1).
setting(d,1).
setting(verbosity,1).
setting(logzero,log(1.0e-6)).
setting(initial_clauses_modeh,1).
setting(max_iter,10).
setting(max_var,5).
setting(max_rules,10).
setting(beamsize,20).
setting(epsilon_parsing,1.0e-10).
setting(tabling,off).
setting(bagof,false).
setting(depth_bound,false).
setting(depth,2).
setting(single_var,false).
setting(compiling,off).
*/
advisedby(A,B):0.264403 :-
professor(B),
student(A).

View File

@ -2,7 +2,7 @@
EMBLEM and SLIPCASE
Copyright (c) 2011, Fabrizio Riguzzi and Elena Bellodi
Copyright (c) 2013, Fabrizio Riguzzi and Elena Bellodi
This package uses the library cudd, see http://vlsi.colorado.edu/~fabio/CUDD/
for the relative license.
@ -41,24 +41,18 @@ typedef struct
tablerow * table;
static variable * vars;
static variable ** vars_ex;
static int * bVar2mVar;
static int ** bVar2mVar_ex;
static double * sigma;
static double ***eta;
static double ***eta_temp;
static double **arrayprob;
static int *rules;
static DdManager *mgr;
static DdManager **mgr_ex;
static int *nVars;
static int *nVars_ex;
static int nRules;
double * probs;
double * nodes_probs_ex;
double ** probs_ex;
static int * boolVars;
static int * boolVars_ex;
tablerow * nodesB;
tablerow * nodesF;
@ -75,13 +69,13 @@ static int init(void);
static int end(void);
static int EM(void);
static int Q(void);
double ProbPath(DdNode *node, int comp_par);
double ProbPath(DdNode *node, int comp_par, int nex);
static int rec_deref(void);
int indexMvar(DdNode *node);
void Forward(DdNode *node);
void Forward(DdNode *node, int nex);
void GetForward(DdNode *node, double ForwProbPath);
void UpdateForward(DdNode * node);
double GetOutsideExpe(DdNode *root,double ex_prob);
void UpdateForward(DdNode * node, int nex);
double GetOutsideExpe(DdNode *root,double ex_prob, int nex);
void Maximization(void);
static double Expectation(DdNode **nodes_ex, int lenNodes);
void init_my_predicates(void);
@ -133,33 +127,27 @@ static int init(void)
static int init_bdd(void)
{
mgr=Cudd_Init(0,0,UNIQUE_SLOTS,CACHE_SLOTS,5120);
Cudd_AutodynEnable(mgr, CUDD_REORDER_GROUP_SIFT);
Cudd_SetMaxCacheHard(mgr, 0);
Cudd_SetLooseUpTo(mgr, 0);
Cudd_SetMinHit(mgr, 15);
mgr_ex=(DdManager **) realloc(mgr_ex, (ex+1)* sizeof(DdManager *));
mgr_ex[ex]=mgr;
mgr_ex[ex]=Cudd_Init(0,0,UNIQUE_SLOTS,CACHE_SLOTS,5120);
Cudd_AutodynEnable(mgr_ex[ex], CUDD_REORDER_GROUP_SIFT);
Cudd_SetMaxCacheHard(mgr_ex[ex], 0);
Cudd_SetLooseUpTo(mgr_ex[ex], 0);
Cudd_SetMinHit(mgr_ex[ex], 15);
bVar2mVar_ex=(int **) realloc(bVar2mVar_ex, (ex+1)* sizeof(int *));
bVar2mVar_ex[ex]=NULL;
bVar2mVar=bVar2mVar_ex[ex];
vars_ex=(variable **) realloc(vars_ex, (ex+1)* sizeof(variable *));
vars_ex[ex]=NULL;
vars=vars_ex[ex];
nVars_ex=(int *) realloc(nVars_ex, (ex+1)* sizeof(int ));
nVars=nVars_ex+ex;
*nVars=0;
nVars_ex[ex]=0;
probs_ex=(double **) realloc(probs_ex, (ex+1)* sizeof(double *));
probs_ex[ex]=NULL;
probs=probs_ex[ex];
boolVars_ex=(int *) realloc(boolVars_ex, (ex+1)* sizeof(int ));
boolVars=boolVars_ex+ex;
*boolVars=0;
boolVars_ex[ex]=0;
return 1;
}
@ -167,9 +155,6 @@ static int init_bdd(void)
static int end_bdd(void)
{
bVar2mVar_ex[ex]=bVar2mVar;
probs_ex[ex]=probs;
vars_ex[ex]=vars;
ex=ex+1;
return 1;
}
@ -184,33 +169,31 @@ static int init_test(void)
nRules=YAP_IntOfTerm(arg1);
mgr=Cudd_Init(0,0,UNIQUE_SLOTS,CACHE_SLOTS,0);
Cudd_AutodynEnable(mgr, CUDD_REORDER_GROUP_SIFT);
Cudd_SetMaxCacheHard(mgr, 1024*1024*1024);
Cudd_SetLooseUpTo(mgr, 1024*1024*512);
mgr_ex[ex]=Cudd_Init(0,0,UNIQUE_SLOTS,CACHE_SLOTS,0);
Cudd_AutodynEnable(mgr_ex[ex], CUDD_REORDER_GROUP_SIFT);
Cudd_SetMaxCacheHard(mgr_ex[ex], 1024*1024*1024);
Cudd_SetLooseUpTo(mgr_ex[ex], 1024*1024*512);
rules= (int *) malloc(nRules * sizeof(int));
bVar2mVar=NULL;
probs=NULL;
vars=NULL;
bVar2mVar_ex[ex]=NULL;
probs_ex[ex]=NULL;
vars_ex[ex]=NULL;
nVars=(int *) malloc(sizeof(int ));
*nVars=0;
nVars_ex[ex]=0;
boolVars=(int *) malloc(sizeof(int ));
*boolVars=0;
boolVars_ex[ex]=0;
return 1;
}
static int end_test(void)
{
free(bVar2mVar);
free(vars);
free(nVars);
free(boolVars);
Cudd_Quit(mgr);
free(probs);
free(bVar2mVar_ex[ex]);
free(vars_ex[ex]);
free(nVars_ex+ex);
free(boolVars_ex+ex);
Cudd_Quit(mgr_ex[ex]);
free(probs_ex[ex]);
free(rules);
return 1;
}
@ -226,16 +209,11 @@ static double Expectation(DdNode **nodes_ex,int lenNodes)
{
if (!Cudd_IsConstant(nodes_ex[i]))
{
mgr=mgr_ex[i];
probs=probs_ex[i];
boolVars=boolVars_ex+i;
nodesB=init_table(*boolVars);
nodesF=init_table(*boolVars);
bVar2mVar=bVar2mVar_ex[i];
vars=vars_ex[i];
nodesB=init_table(boolVars_ex[i]);
nodesF=init_table(boolVars_ex[i]);
Forward(nodes_ex[i]);
rootProb=GetOutsideExpe(nodes_ex[i],example_prob[i]);
Forward(nodes_ex[i],i);
rootProb=GetOutsideExpe(nodes_ex[i],example_prob[i],i);
if (rootProb<=0.0)
CLL = CLL + LOGZERO*example_prob[i];
@ -243,8 +221,8 @@ static double Expectation(DdNode **nodes_ex,int lenNodes)
CLL = CLL + log(rootProb)*example_prob[i];
nodes_probs_ex[i]=rootProb;
destroy_table(nodesB,*boolVars);
destroy_table(nodesF,*boolVars);
destroy_table(nodesB,boolVars_ex[i]);
destroy_table(nodesF,boolVars_ex[i]);
}
else
if (nodes_ex[i]==Cudd_ReadLogicZero(mgr_ex[i]))
@ -307,13 +285,13 @@ static int ret_prob(void)
if (!Cudd_IsConstant(node))
{
table=init_table(*boolVars);
table=init_table(boolVars_ex[ex]);
out=YAP_MkFloatTerm(Prob(node,0));
destroy_table(table,*boolVars);
destroy_table(table,boolVars_ex[ex]);
}
else
{
if (node==Cudd_ReadOne(mgr))
if (node==Cudd_ReadOne(mgr_ex[ex]))
out=YAP_MkFloatTerm(1.0);
else
out=YAP_MkFloatTerm(0.0);
@ -347,10 +325,6 @@ so that it is not recomputed
else
{
nodekey=Cudd_Regular(node);
/* if (comp)
nodekey=Cudd_Complement(nodefw);
else
nodekey=nodefw;*/
value_p=get_value(table,nodekey);
if (value_p!=NULL)
return *value_p;
@ -358,15 +332,15 @@ so that it is not recomputed
{
index=Cudd_NodeReadIndex(node); //Returns the index of the node. The node pointer can be either regular or complemented.
//The index field holds the name of the variable that labels the node. The index of a variable is a permanent attribute that reflects the order of creation.
p=probs[index];
p=probs_ex[ex][index];
T = Cudd_T(node);
F = Cudd_E(node);
pf=Prob(F,comp);
pt=Prob(T,comp);
BChild0=pf*(1-p);
BChild1=pt*p;
mVarIndex=bVar2mVar[index];
v=vars[mVarIndex];
mVarIndex=bVar2mVar_ex[ex][index];
v=vars_ex[ex][mVarIndex];
pos=index-v.firstBoolVar;
res=BChild0+BChild1;
add_node(table,nodekey,res);
@ -390,29 +364,30 @@ static int add_var(void)
arg2=YAP_ARG2;
arg3=YAP_ARG3;
arg4=YAP_ARG4;
*nVars=*nVars+1;
vars=(variable *) realloc(vars,*nVars * sizeof(variable));
v=&vars[*nVars-1];
nVars_ex[ex]=nVars_ex[ex]+1;
vars_ex[ex]=(variable *) realloc(vars_ex[ex],nVars_ex[ex] * sizeof(variable));
v=&vars_ex[ex][nVars_ex[ex]-1];
v->nVal=YAP_IntOfTerm(arg1);
v->nRule=YAP_IntOfTerm(arg3);
v->firstBoolVar=*boolVars;
probs=(double *) realloc(probs,(((*boolVars+v->nVal-1)* sizeof(double))));
bVar2mVar=(int *) realloc(bVar2mVar,((*boolVars+v->nVal-1)* sizeof(int)));
v->firstBoolVar=boolVars_ex[ex];
probs_ex[ex]=(double *) realloc(probs_ex[ex],(((boolVars_ex[ex]+v->nVal-1)* sizeof(double))));
bVar2mVar_ex[ex]=(int *) realloc(bVar2mVar_ex[ex],((boolVars_ex[ex]+v->nVal-1)* sizeof(int)));
probTerm=arg2;
p0=1;
for (i=0;i<v->nVal-1;i++)
{
node=Cudd_bddIthVar(mgr,*boolVars+i);
node=Cudd_bddIthVar(mgr_ex[ex],boolVars_ex[ex]+i);
p=YAP_FloatOfTerm(YAP_HeadOfTerm(probTerm));
bVar2mVar[*boolVars+i]=*nVars-1;
probs[*boolVars+i]=p/p0;
bVar2mVar_ex[ex][boolVars_ex[ex]+i]=nVars_ex[ex]-1;
probs_ex[ex][boolVars_ex[ex]+i]=p/p0;
probTerm_temp=YAP_TailOfTerm(probTerm);
probTerm=probTerm_temp;
p0=p0*(1-p/p0);
}
*boolVars=*boolVars+v->nVal-1;
boolVars_ex[ex]=boolVars_ex[ex]+v->nVal-1;
rules[v->nRule]= v->nVal;
out=YAP_MkIntTerm((YAP_Int)* nVars-1);
out=YAP_MkIntTerm((YAP_Int) nVars_ex[ex]-1);
return YAP_Unify(out,arg4);
}
@ -425,30 +400,30 @@ static int equality(void)
variable v;
DdNode * node, * tmp,*var;
arg1=YAP_ARG1; //var
arg2=YAP_ARG2; //value
arg3=YAP_ARG3; //node
arg1=YAP_ARG1;
arg2=YAP_ARG2;
arg3=YAP_ARG3;
varIndex=YAP_IntOfTerm(arg1);
value=YAP_IntOfTerm(arg2);
v=vars[varIndex];
v=vars_ex[ex][varIndex];
i=v.firstBoolVar;
tmp=Cudd_ReadOne(mgr);
tmp=Cudd_ReadOne(mgr_ex[ex]);
Cudd_Ref(tmp);
node=NULL;
for (i=v.firstBoolVar;i<v.firstBoolVar+value;i++)
{
var=Cudd_bddIthVar(mgr,i);
node=Cudd_bddAnd(mgr,tmp,Cudd_Not(var));
var=Cudd_bddIthVar(mgr_ex[ex],i);
node=Cudd_bddAnd(mgr_ex[ex],tmp,Cudd_Not(var));
Cudd_Ref(node);
Cudd_RecursiveDeref(mgr,tmp);
Cudd_RecursiveDeref(mgr_ex[ex],tmp);
tmp=node;
}
if (!(value==v.nVal-1))
{
var=Cudd_bddIthVar(mgr,v.firstBoolVar+value);
node=Cudd_bddAnd(mgr,tmp,var);
var=Cudd_bddIthVar(mgr_ex[ex],v.firstBoolVar+value);
node=Cudd_bddAnd(mgr_ex[ex],tmp,var);
Cudd_Ref(node);
Cudd_RecursiveDeref(mgr,tmp);
Cudd_RecursiveDeref(mgr_ex[ex],tmp);
}
out=YAP_MkIntTerm((YAP_Int) node);
return(YAP_Unify(out,arg3));
@ -460,7 +435,7 @@ static int one(void)
DdNode * node;
arg=YAP_ARG1;
node = Cudd_ReadOne(mgr);
node = Cudd_ReadOne(mgr_ex[ex]);
Cudd_Ref(node);
out=YAP_MkIntTerm((YAP_Int) node);
return(YAP_Unify(out,arg));
@ -472,7 +447,7 @@ static int zero(void)
DdNode * node;
arg=YAP_ARG1;
node = Cudd_ReadLogicZero(mgr);
node = Cudd_ReadLogicZero(mgr_ex[ex]);
Cudd_Ref(node);
out=YAP_MkIntTerm((YAP_Int) node);
return(YAP_Unify(out,arg));
@ -501,7 +476,7 @@ static int and(void)
arg3=YAP_ARG3;
node1=(DdNode *)YAP_IntOfTerm(arg1);
node2=(DdNode *)YAP_IntOfTerm(arg2);
nodeout=Cudd_bddAnd(mgr,node1,node2);
nodeout=Cudd_bddAnd(mgr_ex[ex],node1,node2);
Cudd_Ref(nodeout);
out=YAP_MkIntTerm((YAP_Int) nodeout);
return(YAP_Unify(out,arg3));
@ -517,7 +492,7 @@ static int or(void)
arg3=YAP_ARG3;
node1=(DdNode *)YAP_IntOfTerm(arg1);
node2=(DdNode *)YAP_IntOfTerm(arg2);
nodeout=Cudd_bddOr(mgr,node1,node2);
nodeout=Cudd_bddOr(mgr_ex[ex],node1,node2);
Cudd_Ref(nodeout);
out=YAP_MkIntTerm((YAP_Int) nodeout);
return(YAP_Unify(out,arg3));
@ -531,7 +506,7 @@ static int garbage_collect(void)
arg1=YAP_ARG1;
arg2=YAP_ARG2;
clearCache=YAP_IntOfTerm(arg1);
nodes=(YAP_Int)cuddGarbageCollect(mgr,clearCache);
nodes=(YAP_Int)cuddGarbageCollect(mgr_ex[ex],clearCache);
out=YAP_MkIntTerm(nodes);
return(YAP_Unify(out,arg2));
}
@ -544,7 +519,7 @@ static int bdd_to_add(void)
arg1=YAP_ARG1;
arg2=YAP_ARG2;
node1=(DdNode *)YAP_IntOfTerm(arg1);
node2= Cudd_BddToAdd(mgr,node1);
node2= Cudd_BddToAdd(mgr_ex[ex],node1);
out=YAP_MkIntTerm((YAP_Int) node2);
return(YAP_Unify(out,arg2));
}
@ -564,11 +539,11 @@ static int create_dot(void)
arg2=YAP_ARG2;
YAP_StringToBuffer(arg2,filename,1000);
inames= (char **) malloc(sizeof(char *)*(*boolVars));
inames= (char **) malloc(sizeof(char *)*(boolVars_ex[ex]));
index=0;
for (i=0;i<*nVars;i++)
for (i=0;i<nVars_ex[ex];i++)
{
v=vars[i];
v=vars_ex[ex][i];
for (b=0;b<v.nVal-1;b++)
{
inames[b+index]=(char *) malloc(sizeof(char)*20);
@ -583,12 +558,12 @@ static int create_dot(void)
}
array[0]=(DdNode *)YAP_IntOfTerm(arg1);
file = open_file(filename, "w");
Cudd_DumpDot(mgr,1,array,inames,onames,file);
Cudd_DumpDot(mgr_ex[ex],1,array,inames,onames,file);
fclose(file);
index=0;
for (i=0;i<*nVars;i++)
for (i=0;i<nVars_ex[ex];i++)
{
v=vars[i];
v=vars_ex[ex][i];
for (b=0;b<v.nVal-1;b++)
{
free(inames[b+index]);
@ -607,13 +582,13 @@ static int rec_deref(void)
arg1=YAP_ARG1;
node=(DdNode *) YAP_IntOfTerm(arg1);
Cudd_RecursiveDeref(mgr, node);
Cudd_RecursiveDeref(mgr_ex[ex], node);
return 1;
}
double ProbPath(DdNode *node,int comp_par)
double ProbPath(DdNode *node,int comp_par, int nex)
{
int index,mVarIndex,comp,pos,position,boolVarIndex;
variable v;
@ -647,42 +622,42 @@ double ProbPath(DdNode *node,int comp_par)
else
{
index=Cudd_NodeReadIndex(node);
p=probs[index];
p=probs_ex[nex][index];
T = Cudd_T(node);
F = Cudd_E(node);
pf=ProbPath(F,comp);
pt=ProbPath(T,comp);
pf=ProbPath(F,comp,nex);
pt=ProbPath(T,comp,nex);
BChild0=pf*(1-p);
BChild1=pt*p;
value_p=get_value(nodesF,nodekey);
e0 = (*value_p)*BChild0;
e1 = (*value_p)*BChild1;
mVarIndex=bVar2mVar[index];
v=vars[mVarIndex];
mVarIndex=bVar2mVar_ex[nex][index];
v=vars_ex[nex][mVarIndex];
pos=index-v.firstBoolVar;
eta_rule=eta_temp[v.nRule];
eta_rule[pos][0]=eta_rule[pos][0]+e0;
eta_rule[pos][1]=eta_rule[pos][1]+e1;
res=BChild0+BChild1;
add_node(nodesB,nodekey,res);
position=Cudd_ReadPerm(mgr,index);
position=Cudd_ReadPerm(mgr_ex[nex],index);
position=position+1;
boolVarIndex=Cudd_ReadInvPerm(mgr,position); //Returns the index of the variable currently in the i-th position of the order.
if (position<*boolVars)
boolVarIndex=Cudd_ReadInvPerm(mgr_ex[nex],position);//Returns the index of the variable currently in the i-th position of the order.
if (position<boolVars_ex[nex])
{
sigma[position]=sigma[position]+e0+e1;
}
if(!Cudd_IsConstant(T))
{
index=Cudd_NodeReadIndex(T);
position=Cudd_ReadPerm(mgr,index);
position=Cudd_ReadPerm(mgr_ex[nex],index);
sigma[position]=sigma[position]-e1;
}
if(!Cudd_IsConstant(F))
{
index=Cudd_NodeReadIndex(F);
position=Cudd_ReadPerm(mgr,index);
position=Cudd_ReadPerm(mgr_ex[nex],index);
sigma[position]=sigma[position]-e0;
}
@ -694,29 +669,29 @@ double ProbPath(DdNode *node,int comp_par)
void Forward(DdNode *root)
void Forward(DdNode *root, int nex)
{
int i,j;
if (*boolVars)
if (boolVars_ex[nex])
{
nodesToVisit= (DdNode ***)malloc(sizeof(DdNode **)* *boolVars);
NnodesToVisit= (int *)malloc(sizeof(int)* *boolVars);
nodesToVisit= (DdNode ***)malloc(sizeof(DdNode **)* boolVars_ex[nex]);
NnodesToVisit= (int *)malloc(sizeof(int)* boolVars_ex[nex]);
nodesToVisit[0]=(DdNode **)malloc(sizeof(DdNode *));
nodesToVisit[0][0]=root;
NnodesToVisit[0]=1;
for(i=1;i<*boolVars;i++)
for(i=1;i<boolVars_ex[nex];i++)
{
nodesToVisit[i]=NULL;
NnodesToVisit[i]=0;
}
add_node(nodesF,Cudd_Regular(root),1);
for(i=0;i<*boolVars;i++)
for(i=0;i<boolVars_ex[nex];i++)
{
for(j=0;j<NnodesToVisit[i];j++)
UpdateForward(nodesToVisit[i][j]);
UpdateForward(nodesToVisit[i][j],nex);
}
for(i=0;i<*boolVars;i++)
for(i=0;i<boolVars_ex[nex];i++)
{
free(nodesToVisit[i]);
}
@ -729,7 +704,7 @@ void Forward(DdNode *root)
}
}
void UpdateForward(DdNode *node)
void UpdateForward(DdNode *node, int nex)
{
int index,position,mVarIndex;
DdNode *T,*E,*nodereg;
@ -743,9 +718,9 @@ void UpdateForward(DdNode *node)
else
{
index=Cudd_NodeReadIndex(node);
mVarIndex=bVar2mVar[index];
v=vars[mVarIndex];
p=probs[index];
mVarIndex=bVar2mVar_ex[nex][index];
v=vars_ex[nex][mVarIndex];
p=probs_ex[nex][index];
nodereg=Cudd_Regular(node);
value_p=get_value(nodesF,nodereg);
if (value_p== NULL)
@ -768,7 +743,7 @@ void UpdateForward(DdNode *node)
{
add_or_replace_node(nodesF,Cudd_Regular(T),*value_p*p);
index=Cudd_NodeReadIndex(T);
position=Cudd_ReadPerm(mgr,index);
position=Cudd_ReadPerm(mgr_ex[nex],index);
nodesToVisit[position]=(DdNode **)realloc(nodesToVisit[position],
(NnodesToVisit[position]+1)* sizeof(DdNode *));
nodesToVisit[position][NnodesToVisit[position]]=T;
@ -787,7 +762,7 @@ void UpdateForward(DdNode *node)
{
add_or_replace_node(nodesF,Cudd_Regular(E),*value_p*(1-p));
index=Cudd_NodeReadIndex(E);
position=Cudd_ReadPerm(mgr,index);
position=Cudd_ReadPerm(mgr_ex[nex],index);
nodesToVisit[position]=(DdNode **)realloc(nodesToVisit[position],
(NnodesToVisit[position]+1)* sizeof(DdNode *));
nodesToVisit[position][NnodesToVisit[position]]=E;
@ -805,22 +780,22 @@ int indexMvar(DdNode * node)
int index,mVarIndex;
index=Cudd_NodeReadIndex(node);
mVarIndex=bVar2mVar[index];
mVarIndex=bVar2mVar_ex[ex][index];
return mVarIndex;
}
double GetOutsideExpe(DdNode *root,double ex_prob)
double GetOutsideExpe(DdNode *root,double ex_prob, int nex)
{
int i,j,mVarIndex,bVarIndex;
double **eta_rule;
double theta,rootProb, T=0;
sigma=(double *)malloc(*boolVars * sizeof(double));
sigma=(double *)malloc(boolVars_ex[nex] * sizeof(double));
for (j=0; j<*boolVars; j++)
for (j=0; j<boolVars_ex[nex]; j++)
{
sigma[j]=0;
}
@ -832,23 +807,23 @@ double GetOutsideExpe(DdNode *root,double ex_prob)
eta_temp[j][i][1]=0;
}
}
rootProb=ProbPath(root,0);
rootProb=ProbPath(root,0,nex);
if (rootProb>0.0)
{
for (j=0; j<*boolVars; j++)
for (j=0; j<boolVars_ex[nex]; j++)
{
T += sigma[j];
bVarIndex=Cudd_ReadInvPerm(mgr,j);
bVarIndex=Cudd_ReadInvPerm(mgr_ex[nex],j);
if (bVarIndex==-1)
{
bVarIndex=j;
}
mVarIndex=bVar2mVar[bVarIndex];
eta_rule=eta_temp[vars[mVarIndex].nRule];
for (i=0; i<vars[mVarIndex].nVal-1;i++)
mVarIndex=bVar2mVar_ex[nex][bVarIndex];
eta_rule=eta_temp[vars_ex[nex][mVarIndex].nRule];
for (i=0; i<vars_ex[nex][mVarIndex].nVal-1;i++)
{
theta=probs[bVarIndex];
theta=probs_ex[nex][bVarIndex];
eta_rule[i][0]=eta_rule[i][0]+T*(1-theta);
eta_rule[i][1]=eta_rule[i][1]+T*theta;
}
@ -891,17 +866,13 @@ void Maximization(void)
for(e=0;e<ex;e++)
{
nVars=nVars_ex+e;
probs=probs_ex[e];
vars=vars_ex[e];
for (j=0;j<*nVars;j++)
for (j=0;j<nVars_ex[e];j++)
{
r=vars[j].nRule;
r=vars_ex[e][j].nRule;
probs_rule=arrayprob[r];
for(i=0;i<rules[r]-1;i++)
{
probs[vars[j].firstBoolVar+i]=probs_rule[i];
probs_ex[e][vars_ex[e][j].firstBoolVar+i]=probs_rule[i];
}
}
}
@ -935,17 +906,14 @@ static int randomize(void)
}
for(e=0;e<ex;e++)
{
nVars=nVars_ex+e;
probs=probs_ex[e];
vars=vars_ex[e];
for (j=0; j<*nVars; j++)
for (j=0; j<nVars_ex[e]; j++)
{
rule=vars[j].nRule;
rule=vars_ex[e][j].nRule;
theta=Theta_rules[rule];
p0=1;
for (i=0; i<vars[j].nVal-1;i++)
for (i=0; i<vars_ex[e][j].nVal-1;i++)
{
probs[vars[j].firstBoolVar+i]=theta[i]/p0;
probs_ex[e][vars_ex[e][j].firstBoolVar+i]=theta[i]/p0;
p0=p0*(1-theta[i]/p0);
}
}
@ -1047,6 +1015,7 @@ static int EM(void)
return (YAP_Unify(out2,arg7));
}
static int Q(void)
{
YAP_Term arg1,arg2,arg3,arg4,out,out1,

View File

@ -0,0 +1,4 @@
type(_A,type_b):0.5.
type(_A,type_c):0.5.

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,151 @@
output(type/2).
input(fibros/2).
input(activity/2).
input(sex/2).
input(action/2).
input(age/2).
input(type/2).
input(got/2).
input(gpt/2).
input(tbil/2).
input(dbil/2).
input(che/2).
input(ttt/2).
input(ztt/2).
input(tcho/2).
input(tp/2).
input(dur/2).
input(b_rel11/2).
input(b_rel12/2).
input(b_rel13/2).
modeh(*,type(+m,type_b)).
modeh(*,type(+m,type_c)).
determination(type/2,sex/2).
determination(type/2,age/2).
determination(type/2,b_rel11/2).
determination(type/2,b_rel12/2).
determination(type/2,b_rel13/2).
determination(type/2,fibros/2).
determination(type/2,activity/2).
determination(type/2,got/2).
determination(type/2,gpt/2).
determination(type/2,tbil/2).
determination(type/2,dbil/2).
determination(type/2,che/2).
determination(type/2,ttt/2).
determination(type/2,ztt/2).
determination(type/2,tcho/2).
determination(type/2,tp/2).
determination(type/2,dur/2).
modeb(*,b_rel11(-b,+m)).
modeb(*,b_rel12(-i,+m)).
modeb(*,b_rel13(-a,+m)).
modeb(*,b_rel11(+b,-m)).
modeb(*,b_rel12(+i,-m)).
modeb(*,b_rel13(+a,-m)).
modeb(*,fibros(+b,fibros_0)).
modeb(*,fibros(+b,fibros_1)).
modeb(*,fibros(+b,fibros_2)).
modeb(*,fibros(+b,fibros_3)).
modeb(*,fibros(+b,fibros_4)).
modeb(*,activity(+b,activity_0)).
modeb(*,activity(+b,activity_1)).
modeb(*,activity(+b,activity_2)).
modeb(*,activity(+b,activity_3)).
modeb(*,activity(+b,activity_false)).
modeb(*,sex(+m,sex_f)).
modeb(*,sex(+m,sex_m)).
modeb(*,age(+m,age_0)).
modeb(*,age(+m,age_1)).
modeb(*,age(+m,age_2)).
modeb(*,age(+m,age_3)).
modeb(*,age(+m,age_4)).
modeb(*,age(+m,age_5)).
modeb(*,age(+m,age_6)).
modeb(*,got(+i,got_1)).
modeb(*,got(+i,got_2)).
modeb(*,got(+i,got_3)).
modeb(*,got(+i,got_4)).
modeb(*,got(+i,got_5)).
modeb(*,gpt(+i,gpt_1)).
modeb(*,gpt(+i,gpt_2)).
modeb(*,gpt(+i,gpt_3)).
modeb(*,gpt(+i,gpt_4)).
modeb(*,tbil(+i,tbil_1)).
modeb(*,tbil(+i,tbil_2)).
modeb(*,dbil(+i,dbil_1)).
modeb(*,dbil(+i,dbil_2)).
modeb(*,che(+i,che_1)).
modeb(*,che(+i,che_2)).
modeb(*,che(+i,che_3)).
modeb(*,che(+i,che_4)).
modeb(*,che(+i,che_5)).
modeb(*,che(+i,che_6)).
modeb(*,che(+i,che_7)).
modeb(*,che(+i,che_8)).
modeb(*,che(+i,che_9)).
modeb(*,che(+i,che_10)).
modeb(*,ttt(+i,ttt_1)).
modeb(*,ttt(+i,ttt_2)).
modeb(*,ttt(+i,ttt_3)).
modeb(*,ttt(+i,ttt_4)).
modeb(*,ttt(+i,ttt_5)).
modeb(*,ttt(+i,ttt_6)).
modeb(*,ztt(+i,ztt_1)).
modeb(*,ztt(+i,ztt_2)).
modeb(*,ztt(+i,ztt_3)).
modeb(*,ztt(+i,ztt_4)).
modeb(*,ztt(+i,ztt_5)).
modeb(*,ztt(+i,ztt_6)).
modeb(*,tcho(+i,tcho_1)).
modeb(*,tcho(+i,tcho_2)).
modeb(*,tcho(+i,tcho_3)).
modeb(*,tcho(+i,tcho_4)).
modeb(*,tp(+i,tp_1)).
modeb(*,tp(+i,tp_2)).
modeb(*,tp(+i,tp_3)).
modeb(*,tp(+i,tp_4)).
modeb(*,dur(+a,dur_0)).
modeb(*,dur(+a,dur_1)).
modeb(*,dur(+a,dur_2)).
modeb(*,dur(+a,dur_3)).
modeb(*,dur(+a,dur_4)).
modeb(*,fibros(+b,-f)).
modeb(*,activity(+b,-a)).
modeb(*,sex(+m,-sex)).
modeb(*,age(+m,-age)).
modeb(*,got(+i,-got)).
modeb(*,gpt(+i,-gpt)).
modeb(*,tbil(+i,-tbil)).
modeb(*,dbil(+i,-dbil)).
modeb(*,che(+i,-che)).
modeb(*,ttt(+i,-ttt)).
modeb(*,ztt(+i,-ztt)).
modeb(*,tcho(+i,-tcho)).
modeb(*,tp(+i,-tp)).
modeb(*,dur(+a,dur)).
lookahead(b_rel11(A,_),[fibros(A,_)]).
lookahead(b_rel11(A,_),[activity(A,_)]).
lookahead(b_rel12(A,_),[got(A,_)]).
lookahead(b_rel11(A,_B),[gpt(A,_)]).
lookahead(b_rel11(A,_B),[tbil(A,_)]).
lookahead(b_rel11(A,_B),[dbil(A,_)]).
lookahead(b_rel11(A,_B),[che(A,_)]).
lookahead(b_rel11(A,_B),[ttt(A,_)]).
lookahead(b_rel11(A,_B),[ztt(A,_)]).
lookahead(b_rel11(A,_B),[tcho(A,_)]).
lookahead(b_rel11(A,_B),[tp(A,_)]).
lookahead(b_rel13(A,_B),[dur(A,_)]).

View File

@ -0,0 +1,40 @@
/* SLIPCASE Final CLL -2.525186
Execution time 45.693000
setting(epsilon_em,0.0001).
setting(epsilon_em_fraction,1.0e-5).
setting(eps,0.0001).
setting(eps_f,1.0e-5).
setting(epsilon_sem,2).
setting(random_restarts_REFnumber,1).
setting(random_restarts_number,1).
setting(iterREF,-1).
setting(iter,-1).
setting(examples,atoms).
setting(group,1).
setting(d,1).
setting(verbosity,1).
setting(logzero,log(1.0e-6)).
setting(initial_clauses_modeh,1).
setting(max_iter,10).
setting(max_var,5).
setting(max_rules,10).
setting(beamsize,20).
setting(epsilon_parsing,1.0e-10).
setting(tabling,off).
setting(bagof,false).
setting(depth_bound,false).
setting(depth,2).
setting(single_var,false).
setting(compiling,off).
*/
type(A,type_b):0.215232.
type(A,type_c):0.513334 :-
b_rel11(B,A),
fibros(B,C),
b_rel11(D,A),
fibros(B,E).
type(A,type_b):0.257763.

View File

@ -92,11 +92,11 @@
'$do_error'(instantiation_error,G).
'$check_op_name'(_,_,',',G) :- !,
'$do_error'(permission_error(modify,operator,','),G).
'$check_op_name'(_,_,'[]',G) :- !,
'$check_op_name'(_,_,'[]',G) :- T \= yf, T\= xf, !,
'$do_error'(permission_error(create,operator,'[]'),G).
'$check_op_name'(_,_,'{}',G) :- !,
'$check_op_name'(_,_,'{}',G) :- T \= yf, T\= xf, !,
'$do_error'(permission_error(create,operator,'{}'),G).
'$check_op_name'(P,T,'|',G) :-
'$check_op_name'(P,T,'|',G) :-
(
integer(P),
P < 1001, P > 0