41static Int p_atom( USES_REGS1 );
42static Int p_atomic( USES_REGS1 );
43static Int p_integer( USES_REGS1 );
44static Int p_nonvar( USES_REGS1 );
45static Int p_number( USES_REGS1 );
46static Int p_var( USES_REGS1 );
47static Int p_db_ref( USES_REGS1 );
48static Int p_primitive( USES_REGS1 );
49static Int p_compound( USES_REGS1 );
50static Int p_float( USES_REGS1 );
51static Int p_equal( USES_REGS1 );
52static Int p_dif( USES_REGS1 );
53static Int p_eq( USES_REGS1 );
54static Int p_arg( USES_REGS1 );
55static Int p_functor( USES_REGS1 );
56static Int p_fail( USES_REGS1 );
57static Int p_true( USES_REGS1 );
77static Int p_fail( USES_REGS1 )
103static Int p_true( USES_REGS1 )
121 deref_head(d0, atom_unk);
123 if (IsAtomTerm(d0) && !IsBlob(AtomOfTerm(d0))) {
131 deref_body(d0, pt0, atom_unk, atom_nvar);
145p_atomic( USES_REGS1 )
149 deref_head(d0, atomic_unk);
151 if (IsAtomicTerm(d0)) {
159 deref_body(d0, pt0, atomic_unk, atomic_nvar);
173p_integer( USES_REGS1 )
177 deref_head(d0, integer_unk);
182 if (IsApplTerm(d0)) {
183 Functor f0 = FunctorOfTerm(d0);
184 if (IsExtensionFunctor(f0)) {
186 case (CELL)FunctorBigInt:
187 { CELL *pt = RepAppl(d0);
188 if ( pt[1] != BIG_INT ) {
193 case (CELL)FunctorLongInt:
205 deref_body(d0, pt0, integer_unk, integer_nvar);
219p_number( USES_REGS1 )
223 deref_head(d0, number_unk);
228 if (IsApplTerm(d0)) {
229 Functor f0 = FunctorOfTerm(d0);
230 if (IsExtensionFunctor(f0)) {
232 case (CELL)FunctorBigInt:
233 { CELL *pt = RepAppl(d0);
234 if ( pt[1] != BIG_RATIONAL && pt[1] != BIG_INT ) {
239 case (CELL)FunctorLongInt:
240 case (CELL)FunctorDouble:
252 deref_body(d0, pt0, number_unk, number_nvar);
266p_db_ref( USES_REGS1 )
270 deref_head(d0, db_ref_unk);
272 if (IsDBRefTerm(d0)) {
280 deref_body(d0, pt0, db_ref_unk, db_ref_nvar);
294p_primitive( USES_REGS1 )
298 deref_head(d0, primitive_unk);
300 if (IsPrimitiveTerm(d0)) {
308 deref_body(d0, pt0, primitive_unk, primitive_nvar);
326 deref_head(d0, float_unk);
328 if (IsFloatTerm(d0)) {
336 deref_body(d0, pt0, float_unk, float_nvar);
350p_compound( USES_REGS1 )
354 deref_head(d0, compound_unk);
356 if (IsPairTerm(d0)) {
359 else if (IsApplTerm(d0)) {
360 if (IsExtensionFunctor(FunctorOfTerm(d0))) {
370 deref_body(d0, pt0, compound_unk, compound_nvar);
384p_nonvar( USES_REGS1 )
388 deref_head(d0, nonvar_unk);
393 deref_body(d0, pt0, nonvar_unk, nonvar_nvar);
411 deref_head(d0, var_unk);
416 deref_body(d0, pt0, var_unk, var_nvar);
432 return(Yap_IUnify(ARG1, ARG2));
436eq(Term t1, Term t2 USES_REGS)
440 deref_head(d0, p_eq_unk1);
445 deref_head(d1, p_eq_nvar1_unk2);
451 if (IsPairTerm(d0)) {
452 if (!IsPairTerm(d1)) {
455 return(iequ_complex(RepPair(d0)-1, RepPair(d0)+1,RepPair(d1)-1));
457 if (IsApplTerm(d0)) {
458 Functor f0 = FunctorOfTerm(d0);
460 if (!IsApplTerm(d1)) {
463 f1 = FunctorOfTerm(d1);
467 if (IsExtensionFunctor(f0)) {
469 case (CELL)FunctorDBRef:
471 case (CELL)FunctorLongInt:
472 return(LongIntOfTerm(d0) == LongIntOfTerm(d1));
473 case (CELL)FunctorString:
474 return(strcmp((
char *)StringOfTerm(d0), (
char *)StringOfTerm(d1)) == 0);
476 case (CELL)FunctorBigInt:
477 return (Yap_gmp_tcmp_big_big(d0, d1) == 0);
479 case (CELL)FunctorDouble:
480 return(FloatOfTerm(d0) == FloatOfTerm(d1));
485 return(iequ_complex(RepAppl(d0), RepAppl(d0)+ArityOfFunctor(f0), RepAppl(d1)));
490 deref_body(d1, pt0, p_eq_nvar1_unk2, p_eq_nvar1_nvar2);
492 AddCompareToQueue(TermEq, d0, d1);
504 deref_body(d0, pt0, p_eq_unk1, p_eq_nvar1);
507 deref_head(d1, p_eq_var1_unk2);
510 AddCompareToQueue(TermEq, d0, d1);
518 deref_body(d1, pt1, p_eq_var1_unk2, p_eq_var1_nvar2);
521 if ((IsAttVar(pt0)||IsAttVar(pt1)) && pt1!=pt0) {
522 AddCompareToQueue(TermEq, d0, d1);
567 return eq(ARG1,ARG2 PASS_REGS);
571Yap_eq(Term t1, Term t2)
574 return eq(t1,t2 PASS_REGS);
588 register CELL *HBREG = HB;
593 deref_head(d0, dif_unk1);
597 deref_head(d1, dif_nvar1_unk2);
603 if (IsAtomOrIntTerm(d0) || IsAtomOrIntTerm(d1)) {
613 LOCAL_DoNotWakeUp =
true;
615 register tr_fr_ptr pt0;
628 d0 = Yap_IUnify(d0, d1);
630 LOCAL_DoNotWakeUp =
false;
634 SET_BB(PROTECT_FROZEN_B(pt1));
642 d1 = TrailTerm(--TR);
644#if defined(YAPOR_SBA) && defined(YAPOR)
646 if (Unsigned((Int)(d1)-(Int)(H_FZ)) >
647 Unsigned((Int)(B_FZ)-(Int)(H_FZ))) {
648 RESET_VARIABLE(STACK_TO_SBA(d1));
653#ifdef MULTI_ASSIGNMENT_VARIABLES
655 CELL *pt = RepAppl(d1);
660 pt[0] = TrailVal(--TR);
662 pt[0] = TrailTerm(--TR);
674 deref_body(d0, pt0, dif_unk1, dif_nvar1);
680 deref_body(d1, pt0, dif_nvar1_unk2, dif_nvar1_nvar2);
706 register CELL *HBREG = HB;
710 deref_head(d0, arg_arg1_unk);
715 else if (IsLongIntTerm(d0)) {
716 d0 = LongIntOfTerm(d0);
718 if (!IsBigIntTerm( d0 ))
719 Yap_Error(TYPE_ERROR_INTEGER,d0,
"arg 1 of arg/3");
726 deref_head(d1, arg_arg2_unk);
730 if (IsApplTerm(d1)) {
734 if (IsExtensionFunctor((
Functor) d1)) {
735 Yap_Error(TYPE_ERROR_COMPOUND, d1,
"arg 2 of arg/3");
740 (Int)d0 > ArityOfFunctor((
Functor) d1) ||
741 Yap_IUnify(pt0[d0], ARG3) == FALSE) {
753 else if (IsPairTerm(d1)) {
758 if (Yap_IUnify((CELL)pt0, ARG3) == FALSE) {
765 if (Yap_IUnify((CELL)(pt0+1), ARG3) == FALSE) {
772 Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO,
773 MkIntegerTerm(d0),
"arg 1 of arg/3");
779 Yap_Error(TYPE_ERROR_COMPOUND, d1,
"arg 2 of arg/3");
784 deref_body(d1, pt0, arg_arg2_unk, arg_arg2_nvar);
785 Yap_Error(INSTANTIATION_ERROR,(CELL)pt0,
"arg 2 of arg/3");;
791 deref_body(d0, pt0, arg_arg1_unk, arg_arg1_nvar);
792 Yap_Error(INSTANTIATION_ERROR,(CELL)pt0,
"arg 1 of arg/3");;
820p_functor( USES_REGS1 )
823 register CELL *HBREG;
832 deref_head(d0, func_unk);
836 if (IsApplTerm(d0)) {
838 if (IsExtensionFunctor((
Functor) d1)) {
839 if (d1 == (CELL)FunctorDouble) {
841 }
else if (d1 == (CELL)FunctorLongInt) {
843 }
else if (d1 == (CELL)FunctorString) {
848 d0 = MkAtomTerm(NameOfFunctor((
Functor) d1));
849 d1 = MkIntTerm(ArityOfFunctor((
Functor) d1));
852 else if (IsPairTerm(d0)) {
862 register CELL arity = d1;
865 deref_head(d1, func_nvar_unk);
876 deref_body(d1, pt0, func_nvar_unk, func_nvar_nvar);
886 deref_head(d1, func_nvar3_unk);
897 deref_body(d1, pt0, func_nvar3_unk, func_nvar3_nvar);
908 deref_body(d0, pt0, func_unk, func_nvar);
912 deref_head(d0, func_var_2unk);
917 deref_head(d1, func_var_3unk);
920 if (IsIntegerTerm(d1))
921 d1 = IntegerOfTerm(d1);
923 if (IsBigIntTerm(d1)) {
924 Yap_Error(RESOURCE_ERROR_STACK, ARG3,
"functor/3");
926 Yap_Error(TYPE_ERROR_INTEGER,ARG3,
"functor/3");
930 if (!IsAtomicTerm(d0)) {
931 Yap_Error(TYPE_ERROR_ATOMIC,d0,
"functor/3");
936 if (d0 == TermDot && d1 == 2) {
938 RESET_VARIABLE(HR+1);
942 else if ((Int)d1 > 0) {
944 if (!IsAtomTerm(d0)) {
945 Yap_Error(TYPE_ERROR_ATOM,d0,
"functor/3");
949 if (!IsAtomTerm(d0)) {
953 d0 = (CELL) Yap_MkFunctor(AtomOfTerm(d0), (Int) d1);
957 while (pt1+d1 > ENV - StackGap( PASS_REGS1 )) {
959 Yap_Error(RESOURCE_ERROR_STACK, TermNil, LOCAL_ErrorMessage);
971 }
else if ((Int)d1 < 0) {
972 Yap_Error(DOMAIN_ERROR_NOT_LESS_THAN_ZERO,MkIntegerTerm(d1),
"functor/3");
982 deref_body(d1, pt1, func_var_3unk, func_var_3nvar);
983 Yap_ThrowError(INSTANTIATION_ERROR,(CELL)pt1,
"functor/3");
991 deref_body(d0, pt1, func_var_2unk, func_var_2nvar);
992 Yap_ThrowError(INSTANTIATION_ERROR,(CELL)pt1,
"functor/3");
1003 return(MkIntegerTerm(LCL0-(CELL *)cp));
1008p_cut_by( USES_REGS1 )
1012 deref_head(d0, cutby_x_unk);
1015 if (!IsIntegerTerm(d0)) {
1017 if (!IsIntTerm(d0)) {
1028 while (POP_CHOICE_POINT(pt0))
1040 while (B->cp_b < pt0) {
1043 abolish_incomplete_subgoals(B);
1053 deref_body(d0, pt0, cutby_x_unk, cutby_x_nvar);
1062p_erroneous_call( USES_REGS1 )
1064 Yap_Error(SYSTEM_ERROR_INTERNAL, TermNil,
"bad call to internal built-in");
1076static Int current_choice_point(USES_REGS1)
1078 Term t = Deref(ARG1);
1081 register CELL *HBREG = HB;
1086 while (b && b->cp_ap == TRUSTFAILCODE && b->cp_b)
1088 td = cp_as_integer(b PASS_REGS);
1089 YapBind((CELL *)t, td);
1119 genarg( USES_REGS1 )
1121 Term t0 = Deref(ARG1);
1122 Term t1 = Deref(ARG2);
1127 if (!IsVarTerm(t0)) {
1128 res = p_arg( PASS_REGS1 );
1135 if (IsVarTerm(t1)) {
1136 Yap_Error(INSTANTIATION_ERROR,t1,
"genarg/3");
1139 if (IsPrimitiveTerm(t1)) {
1140 Yap_Error(TYPE_ERROR_COMPOUND,t1,
"genarg/3");
1143 if (IsPairTerm(t1)) {
1145 end = RepPair(t1)+1;
1148 arity = ArityOfFunctor(FunctorOfTerm(t1));
1153 res = Yap_unify(ARG1,MkIntTerm(1)) &&
1154 Yap_unify(ARG3,pt[0]);
1162 EXTRA_CBACK_ARG(3,1) = (Term)(pt+1);
1163 EXTRA_CBACK_ARG(3,2) = (Term)(end);
1164 EXTRA_CBACK_ARG(3,3) = MkIntegerTerm(arity);
1169cont_genarg( USES_REGS1 )
1175 pt = (CELL *)EXTRA_CBACK_ARG(3,1);
1176 end = (CELL *)EXTRA_CBACK_ARG(3,2);
1177 arity = IntegerOfTerm(EXTRA_CBACK_ARG(3,3));
1179 res = Yap_unify(ARG1,MkIntegerTerm(arity)) &&
1180 Yap_unify(ARG3,pt[0]);
1187 EXTRA_CBACK_ARG(3,1) = (Term)(pt+1);
1188 return Yap_unify(ARG1,MkIntegerTerm(arity-(end-pt))) &&
1189 Yap_unify(ARG3,pt[0]);
1194 Yap_InitInlines(
void)
1197 Term cm = CurrentModule;
1198 Yap_InitAsmPred(
"cut_by", 1, _cut_by, p_cut_by, SafePredFlag);
1199 Yap_InitAsmPred(
"current_choice_point", 1, _save_by, current_choice_point, SafePredFlag);
1200 Yap_InitAsmPred(
"atom", 1, _atom, p_atom, SafePredFlag);
1201 Yap_InitAsmPred(
"atomic", 1, _atomic, p_atomic, SafePredFlag);
1202 Yap_InitAsmPred(
"integer", 1, _integer, p_integer, SafePredFlag);
1203 Yap_InitAsmPred(
"nonvar", 1, _nonvar, p_nonvar, SafePredFlag);
1204 Yap_InitAsmPred(
"number", 1, _number, p_number, SafePredFlag);
1205 Yap_InitAsmPred(
"var", 1, _var, p_var, SafePredFlag);
1206 Yap_InitAsmPred(
"db_reference", 1, _db_ref, p_db_ref, SafePredFlag);
1207 Yap_InitAsmPred(
"primitive", 1, _primitive, p_primitive, SafePredFlag);
1208 Yap_InitAsmPred(
"compound", 1, _compound, p_compound, SafePredFlag);
1209 Yap_InitAsmPred(
"float", 1, _float, p_float, SafePredFlag);
1210 Yap_InitAsmPred(
"=", 2, _equal, p_equal, SafePredFlag);
1211#if INLINE_BIG_COMPARISONS
1212 Yap_InitAsmPred(
"\\=", 2, _dif, p_dif, SafePredFlag|TestPredFlag);
1213 Yap_InitAsmPred(
"==", 2, _eq, p_eq, SafePredFlag|TestPredFlag);
1215 Yap_InitCPred(
"\\=", 2, p_dif, SafePredFlag);
1216 Yap_InitCPred(
"==", 2, p_eq, SafePredFlag);
1218 Yap_InitAsmPred(
"arg", 3, _arg, p_arg, SafePredFlag);
1219 Yap_InitAsmPred(
"functor", 3, _functor, p_functor, 0);
1220 Yap_InitAsmPred(
"$label_ctl", 2, _p_label_ctl, p_erroneous_call, SafePredFlag);
1221 CurrentModule = ARG_MODULE;
1222 Yap_InitCPredBack(
"genarg", 3, 3, genarg, cont_genarg,SafePredFlag);
1224 Yap_InitCPred(
"true", 0, p_true, SafePredFlag);
1225 Yap_InitCPred(
"otherwise", 0, p_true, SafePredFlag);
1226 Yap_InitCPred(
"false", 0, p_fail, SafePredFlag);
1227 Yap_InitCPred(
"fail", 0, p_fail, SafePredFlag);