56static Int p_setarg( USES_REGS1 );
57static Int p_create_mutable( USES_REGS1 );
58static Int p_get_mutable( USES_REGS1 );
59static Int p_update_mutable( USES_REGS1 );
60static Int p_is_mutable( USES_REGS1 );
72 CELL ti = Deref(ARG1), ts = Deref(ARG2), t3 = Deref(ARG3);
76 VarOfTerm(t3) > HR &&VarOfTerm(t3) < ASP) {
78 Term tn = MkVarTerm();
79 Bind_Local(VarOfTerm(t3), tn);
83 Yap_Error(INSTANTIATION_ERROR,ti,
"setarg/3");
89 Term te = Yap_Eval(ti);
90 if (IsIntegerTerm(te)) {
91 i = IntegerOfTerm(te);
93 Yap_Error(TYPE_ERROR_INTEGER,ti,
"setarg/3");
99 Yap_Error(INSTANTIATION_ERROR,ts,
"setarg/3");
100 }
else if(IsApplTerm(ts)) {
102 if (IsExtensionFunctor(FunctorOfTerm(ts))) {
103 Yap_Error(TYPE_ERROR_COMPOUND,ts,
"setarg/3");
106 if (i < 1 || i > (Int)ArityOfFunctor(FunctorOfTerm(ts))) {
108 Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO,ts,
"setarg/3");
111 Yap_Error(DOMAIN_ERROR_NOT_ZERO,ts,
"setarg/3");
117 }
else if(IsPairTerm(ts)) {
119 if (i < 1 || i > 2) {
121 Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO,ts,
"setarg/3");
124 pt = RepPair(ts)+i-1;
128 Yap_Error(TYPE_ERROR_COMPOUND,ts,
"setarg/3");
159NewTimedVar(CELL val USES_REGS)
163 if (IsVarTerm(val) &&
164 VarOfTerm(val) > HR) {
165 Term nval = MkVarTerm();
166 Bind_Local(VarOfTerm(val), nval);
170 *HR++ = (CELL)FunctorMutable;
172 RESET_VARIABLE(&(tv->clock));
179Yap_NewTimedVar(CELL val)
182 return NewTimedVar(val PASS_REGS);
186Yap_NewEmptyTimedVar(
void )
189 Term out = AbsAppl(HR);
191 *HR++ = (CELL)FunctorMutable;
193 RESET_VARIABLE(&(tv->clock));
194 RESET_VARIABLE(&(tv->value));
200Yap_NewCompactTimedVar( Term v )
203 Term out = AbsAppl(HR);
205 *HR++ = (CELL)FunctorMutable;
207 RESET_VARIABLE(&(tv->clock));
214ReadTimedVar(Term inv)
217 return(Deref(tv->value));
221Yap_ReadTimedVar(Term inv)
223 return ReadTimedVar(inv);
229UpdateTimedVar(Term inv, Term
new USES_REGS)
233 CELL* timestmp = (CELL *)(tv->clock);
234 if (IsVarTerm(
new) &&
235 VarOfTerm(
new) > HR) {
236 Term nnew = MkVarTerm();
237 Bind_Local(VarOfTerm(
new), nnew);
240 if (timestmp > B->cp_h
247 if (Unsigned((Int)(tv)-(Int)(H_FZ)) >
248 Unsigned((Int)(B_FZ)-(Int)(H_FZ)))
249 *STACK_TO_SBA(&(tv->value)) =
new;
254 Term nclock = (Term)HR;
255 *HR++ = TermFoundVar;
256 MaBind(&(tv->clock), nclock);
257 MaBind(&(tv->value),
new);
264Yap_UpdateTimedVar(Term inv, Term
new)
267 return UpdateTimedVar(inv,
new PASS_REGS);
276p_create_mutable( USES_REGS1 )
278 Term t = NewTimedVar(Deref(ARG1) PASS_REGS);
279 return(Yap_unify(ARG2,t));
288p_get_mutable( USES_REGS1 )
290 Term t = Deref(ARG2);
292 Yap_Error(INSTANTIATION_ERROR, t,
"get_mutable/3");
295 if (!IsApplTerm(t)) {
296 Yap_Error(TYPE_ERROR_COMPOUND,t,
"get_mutable/3");
299 if (FunctorOfTerm(t) != FunctorMutable) {
300 Yap_Error(DOMAIN_ERROR_MUTABLE,t,
"get_mutable/3");
304 return(Yap_unify(ARG1, t));
316p_update_mutable( USES_REGS1 )
318 Term t = Deref(ARG2);
320 Yap_Error(INSTANTIATION_ERROR, t,
"update_mutable/3");
323 if (!IsApplTerm(t)) {
324 Yap_Error(TYPE_ERROR_COMPOUND,t,
"update_mutable/3");
327 if (FunctorOfTerm(t) != FunctorMutable) {
328 Yap_Error(DOMAIN_ERROR_MUTABLE,t,
"update_mutable/3");
331 UpdateTimedVar(t, Deref(ARG1) PASS_REGS);
341p_is_mutable( USES_REGS1 )
343 Term t = Deref(ARG1);
347 if (!IsApplTerm(t)) {
350 if (FunctorOfTerm(t) != FunctorMutable) {
389static Int nb_setarg(USES_REGS1) {
390 Term wheret = Deref(ARG1);
396 if (IsVarTerm(wheret)) {
397 Yap_ThrowError(INSTANTIATION_ERROR, wheret,
"nb_setarg");
400 if (!IsIntegerTerm(wheret)) {
401 Yap_ThrowError(TYPE_ERROR_INTEGER, wheret,
"nb_setarg");
404 pos = IntegerOfTerm(wheret);
406 if (IsVarTerm(dest)) {
407 Yap_ThrowError(INSTANTIATION_ERROR, dest,
"nb_setarg");
409 }
else if (IsPrimitiveTerm(dest)) {
411 }
else if (IsPairTerm(dest)) {
414 arity = ArityOfFunctor(FunctorOfTerm(dest));
416 if (pos < 1 || pos > arity)
421 to = CopyTermToArena(Deref(ARG3), FALSE, TRUE, NULL, &LOCAL_GlobalArena, NULL
427 if (IsPairTerm(dest)) {
428 destp = RepPair(dest) - 1;
430 destp = RepAppl(dest);
446static Int nb_set_shared_arg(USES_REGS1) {
447 Term wheret = Deref(ARG1);
453 if (IsVarTerm(wheret)) {
454 Yap_ThrowError(INSTANTIATION_ERROR, wheret,
"nb_setarg");
457 if (!IsIntegerTerm(wheret)) {
458 Yap_ThrowError(TYPE_ERROR_INTEGER, wheret,
"nb_setarg");
461 pos = IntegerOfTerm(wheret);
463 if (IsVarTerm(dest)) {
464 Yap_ThrowError(INSTANTIATION_ERROR, dest,
"nb_setarg");
466 }
else if (IsPrimitiveTerm(dest)) {
468 }
else if (IsPairTerm(dest)) {
471 arity = ArityOfFunctor(FunctorOfTerm(dest));
473 if (pos < 1 || pos > arity)
476 to = CopyTermToArena(Deref(ARG3), TRUE, TRUE, NULL, &LOCAL_GlobalArena, NULL PASS_REGS);
480 if (IsPairTerm(dest)) {
481 destp = RepPair(dest) - 1;
483 destp = RepAppl(dest);
499static Int nb_linkarg(USES_REGS1) {
500 Term wheret = Deref(ARG1);
505 if (IsVarTerm(wheret)) {
506 Yap_ThrowError(INSTANTIATION_ERROR, wheret,
"nb_setarg");
509 if (!IsIntegerTerm(wheret)) {
510 Yap_ThrowError(TYPE_ERROR_INTEGER, wheret,
"nb_setarg");
513 pos = IntegerOfTerm(wheret);
515 if (IsVarTerm(dest)) {
516 Yap_ThrowError(INSTANTIATION_ERROR, dest,
"nb_setarg");
518 }
else if (IsPrimitiveTerm(dest)) {
521 }
else if (IsPairTerm(dest)) {
523 destp = RepPair(dest) - 1;
525 arity = ArityOfFunctor(FunctorOfTerm(dest));
526 destp = RepAppl(dest);
528 if (pos < 1 || pos > arity)
531 destp[pos] = Deref(ARG3);
561static Int nb_linkval(USES_REGS1) {
562 Term t = Deref(ARG1), to;
565 Yap_ThrowError(INSTANTIATION_ERROR, t,
"nb_linkval");
567 }
else if (!IsAtomTerm(t)) {
568 Yap_ThrowError(TYPE_ERROR_ATOM, t,
"nb_linkval");
571 ge = GetGlobalEntry(AtomOfTerm(t) PASS_REGS);
573 WRITE_LOCK(ge->GRWLock);
575 WRITE_UNLOCK(ge->GRWLock);
581Yap_InitMaVarCPreds(
void)
583#ifdef MULTI_ASSIGNMENT_VARIABLES
584 Yap_InitCPred(
"setarg", 3, p_setarg, SafePredFlag);
585 Yap_InitCPred(
"nb_setarg", 3, nb_setarg, 0L);
586 Yap_InitCPred(
"create_mutable", 2, p_create_mutable, SafePredFlag);
587 Yap_InitCPred(
"get_mutable", 2, p_get_mutable, SafePredFlag);
588 Yap_InitCPred(
"update_mutable", 2, p_update_mutable, SafePredFlag);
589 Yap_InitCPred(
"is_mutable", 1, p_is_mutable, SafePredFlag);
590 Yap_InitCPred(
"nb_set_shared_arg", 3, nb_set_shared_arg, 0L);
591 Yap_InitCPred(
"nb_linkval", 2, nb_linkval, 0L);
592 Yap_InitCPred(
"nb_linkarg", 3, nb_linkarg, 0L);