176 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			176 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
 | 
						|
#ifndef BPROLOG_H
 | 
						|
 | 
						|
#define BPROLOG_H 1
 | 
						|
 | 
						|
#include <YapInterface.h>
 | 
						|
#include <math.h>
 | 
						|
#include "inline-only.h"
 | 
						|
 | 
						|
typedef YAP_Term TERM;
 | 
						|
typedef YAP_Int BPLONG;
 | 
						|
typedef YAP_UInt BPULONG;
 | 
						|
typedef BPLONG *BPLONG_PTR;
 | 
						|
 | 
						|
#define BP_TRUE TRUE
 | 
						|
#define BP_FALSE FALSE
 | 
						|
 | 
						|
//extern TERM bp_get_call_arg(int i, int arity);
 | 
						|
#define bp_get_call_arg( i,  arity) YAP_A(i)
 | 
						|
 | 
						|
//extern int bp_is_atom(TERM t)
 | 
						|
#define bp_is_atom(t) YAP_IsAtomTerm(t)
 | 
						|
 | 
						|
//extern int bp_is_integer(TERM t)
 | 
						|
#define bp_is_integer(t) YAP_IsIntTerm(t)
 | 
						|
 | 
						|
//extern int bp_is_float(TERM t)
 | 
						|
#define bp_is_float(t) YAP_IsFloatTerm(t)
 | 
						|
 | 
						|
//extern int bp_is_nil(TERM t)
 | 
						|
#define bp_is_nil(t) YAP_IsTermNil(t)
 | 
						|
 | 
						|
//extern int bp_is_list(TERM t)
 | 
						|
#define bp_is_list(t) YAP_IsPairTerm(t)
 | 
						|
 | 
						|
//extern int bp_is_structure(TERM t)
 | 
						|
#define bp_is_structure(t) YAP_IsApplTerm(t)
 | 
						|
 | 
						|
//extern int bp_is_compound(TERM t)
 | 
						|
#define bp_is_compound(t)  YAP_IsCompoundTerm(t)
 | 
						|
 | 
						|
//extern int bp_is_unifiable(TERM t1, Term t2)
 | 
						|
#define bp_is_unifiable(t1, t2) YAP_unifiable(t1, t2)
 | 
						|
 | 
						|
//extern int bp_is_identical(TERM t1, Term t2)
 | 
						|
#define bp_is_identical(t1, t2) YAP_ExactlyEqual(t1, t2)
 | 
						|
 | 
						|
// int bp_get_integer(TERM t)
 | 
						|
#define bp_get_integer(t) YAP_IntOfTerm(t)
 | 
						|
 | 
						|
// double bp_get_float(TERM t)
 | 
						|
#define bp_get_float(t)  YAP_FloatOfTerm(t)
 | 
						|
 | 
						|
// char *bp_get_name(TERM t)
 | 
						|
inline static const char *
 | 
						|
bp_get_name(TERM t)
 | 
						|
{
 | 
						|
  if (YAP_IsAtomTerm(t)) {
 | 
						|
    return YAP_AtomName(YAP_AtomOfTerm(t));
 | 
						|
  }
 | 
						|
  if (YAP_IsApplTerm(t)) {
 | 
						|
    return YAP_AtomName(YAP_NameOfFunctor(YAP_FunctorOfTerm(t)));
 | 
						|
  }
 | 
						|
  // exception = illegal_arguments;
 | 
						|
  return NULL;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
// char *bp_get_name(TERM t)
 | 
						|
static inline int
 | 
						|
bp_get_arity(TERM t)
 | 
						|
{
 | 
						|
  if (YAP_IsAtomTerm(t)) {
 | 
						|
    return 0;
 | 
						|
  }
 | 
						|
  if (YAP_IsApplTerm(t)) {
 | 
						|
    return (int)YAP_ArityOfFunctor(YAP_FunctorOfTerm(t));
 | 
						|
  }
 | 
						|
  // exception = illegal_arguments;
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
//extern int bp_unify(TERM t1, TERM t2)
 | 
						|
#define bp_unify(t1, t2) YAP_Unify(t1, t2)
 | 
						|
 | 
						|
//TERM bp_get_arg(int i, TERM t)
 | 
						|
#define bp_get_arg(i, t) YAP_ArgOfTerm(i, t)
 | 
						|
 | 
						|
//TERM bp_get_car(Term t)
 | 
						|
#define bp_get_car(t) YAP_HeadOfTerm(t)
 | 
						|
 | 
						|
//TERM bp_get_cdr(Term t)
 | 
						|
#define bp_get_cdr(t) YAP_TailOfTerm(t)
 | 
						|
 | 
						|
// void bp_write(TERM t)
 | 
						|
#define bp_write(t) YAP_WriteTerm(t, NULL, 0)
 | 
						|
 | 
						|
// TERM bp_build_var()
 | 
						|
#define bp_build_var(t) YAP_MkVarTerm()
 | 
						|
 | 
						|
// TERM bp_build_integer(int i)
 | 
						|
#define bp_build_integer(i) YAP_MkIntTerm(i)
 | 
						|
 | 
						|
// TERM bp_build_float(double f)
 | 
						|
#define bp_build_float(f) YAP_MkFloatTerm(f)
 | 
						|
 | 
						|
// TERM bp_build_atom(char *name)
 | 
						|
#define bp_build_atom(name) YAP_MkAtomTerm(YAP_LookupAtom((name)))
 | 
						|
 | 
						|
// TERM bp_build_nil()
 | 
						|
#define bp_build_nil() YAP_TermNil()
 | 
						|
 | 
						|
// TERM bp_build_list()
 | 
						|
#define bp_build_list() YAP_MkNewPairTerm()
 | 
						|
 | 
						|
// TERM bp_build_structure(char *name, int arity)
 | 
						|
#define bp_build_structure(name, arity) YAP_MkNewApplTerm(YAP_MkFunctor(YAP_LookupAtom(name),arity), arity)
 | 
						|
 | 
						|
// TERM bp_insert_pred(char *name, int arity, int (*func)())
 | 
						|
#define bp_insert_pred(name, arity, func) YAP_UserCPredicate(name, func, arity)
 | 
						|
 | 
						|
INLINE_ONLY extern inline int bp_call_string(const char *goal);
 | 
						|
INLINE_ONLY extern inline int bp_call_term(TERM t);
 | 
						|
INLINE_ONLY extern inline int bp_next_solution(void);
 | 
						|
INLINE_ONLY extern inline int bp_mount_query_term(TERM goal);
 | 
						|
 | 
						|
// int bp_call_string(char *goal)
 | 
						|
INLINE_ONLY extern inline int
 | 
						|
bp_call_string(const char *goal) {
 | 
						|
  return YAP_RunGoal(YAP_ReadBuffer(goal, NULL));
 | 
						|
}
 | 
						|
 | 
						|
// int bp_call_term(TERM goal)
 | 
						|
INLINE_ONLY extern inline int
 | 
						|
bp_call_term(TERM t) {
 | 
						|
  return YAP_RunGoal(t);
 | 
						|
}
 | 
						|
 | 
						|
#define TOAM_NOTSET 0L
 | 
						|
 | 
						|
#define curr_out stdout
 | 
						|
 | 
						|
#define BP_ERROR (-1)
 | 
						|
 | 
						|
#define INTERRUPT 0x2L
 | 
						|
 | 
						|
#define exception  YAP_BPROLOG_exception
 | 
						|
#define curr_toam_status  YAP_BPROLOG_curr_toam_status
 | 
						|
 | 
						|
extern YAP_Term YAP_BPROLOG_curr_toam_status;
 | 
						|
extern YAP_Int YAP_BPROLOG_exception;
 | 
						|
 | 
						|
// TERM bp_next_solution()
 | 
						|
INLINE_ONLY extern inline int bp_next_solution(void) 
 | 
						|
{
 | 
						|
  if (curr_toam_status) {
 | 
						|
    TERM goal = curr_toam_status;
 | 
						|
    curr_toam_status = TOAM_NOTSET;
 | 
						|
    return YAP_RunGoal(goal);
 | 
						|
  }
 | 
						|
  return YAP_RestartGoal();
 | 
						|
}
 | 
						|
 | 
						|
// void bp_mount_query_string(char *goal)
 | 
						|
#define bp_mount_query_string(goal) (curr_toam_status = YAP_ReadBuffer(goal, NULL))
 | 
						|
 | 
						|
// void bp_mount_query_term(TERM goal)
 | 
						|
INLINE_ONLY extern inline int
 | 
						|
bp_mount_query_term(TERM goal)
 | 
						|
{
 | 
						|
  curr_toam_status = goal;
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
#endif /* BPROLOG_H */
 |