git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@1639 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
		
			
				
	
	
		
			151 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			151 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*************************************************************************
 | 
						|
*									 *
 | 
						|
*	 YAP Prolog 							 *
 | 
						|
*									 *
 | 
						|
*	Yap Prolog was developed at NCCUP - Universidade do Porto	 *
 | 
						|
*									 *
 | 
						|
* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997	 *
 | 
						|
*									 *
 | 
						|
**************************************************************************
 | 
						|
*									 *
 | 
						|
* File:		random.c						 *
 | 
						|
* Last rev:								 *
 | 
						|
* mods:									 *
 | 
						|
* comments:	regular expression interpreter                           *
 | 
						|
*									 *
 | 
						|
*************************************************************************/
 | 
						|
 | 
						|
#include "config.h"
 | 
						|
#include "YapInterface.h"
 | 
						|
#include <math.h>
 | 
						|
#if defined(__MINGW32__) || _MSC_VER
 | 
						|
#include <windows.h>
 | 
						|
#endif
 | 
						|
 | 
						|
void PROTO(init_matrices, (void));
 | 
						|
 | 
						|
static int
 | 
						|
int_min_of_matrix(void)
 | 
						|
{
 | 
						|
  Term t = YAP_ARG1;
 | 
						|
  YAP_UInt dim = YAP_ArityOfFunctor(YAP_FunctorOfTerm(t)), i, pos;
 | 
						|
  YAP_Int *mat = (YAP_Int *)malloc( dim*sizeof(YAP_Int) ), min;
 | 
						|
  if (!mat)
 | 
						|
    return FALSE;
 | 
						|
  if (!YAP_ArgsToIntArray(t, dim, mat))
 | 
						|
    return FALSE;
 | 
						|
  
 | 
						|
  min = mat[0];
 | 
						|
  pos = 0;
 | 
						|
  for (i = 1; i < dim; i++) {
 | 
						|
    if (mat[i] < min) {
 | 
						|
      min = mat[i];
 | 
						|
      pos = i;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  return YAP_unify(YAP_ARG2, YAP_MkIntTerm(min)) &&
 | 
						|
    YAP_unify(YAP_ARG3, YAP_MkIntTerm(pos));
 | 
						|
}
 | 
						|
 | 
						|
static int
 | 
						|
float_min_of_matrix(void)
 | 
						|
{
 | 
						|
  Term t = YAP_ARG1;
 | 
						|
  YAP_UInt dim = YAP_ArityOfFunctor(YAP_FunctorOfTerm(t)), i, pos;
 | 
						|
  YAP_Float *mat = (YAP_Float *)malloc( dim*sizeof(YAP_Float) ), min;
 | 
						|
 | 
						|
  if (!mat)
 | 
						|
    return FALSE;
 | 
						|
  if (!YAP_ArgsToFloatArray(t, dim, mat))
 | 
						|
    return FALSE;
 | 
						|
  
 | 
						|
  min = mat[0];
 | 
						|
  pos = 0;
 | 
						|
  for (i = 1; i < dim; i++) {
 | 
						|
    if (mat[i] < min) {
 | 
						|
      min = mat[i];
 | 
						|
      pos = i;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  return YAP_unify(YAP_ARG2, YAP_MkFloatTerm(min)) &&
 | 
						|
    YAP_unify(YAP_ARG3, YAP_MkIntTerm(pos));
 | 
						|
}
 | 
						|
 | 
						|
static int
 | 
						|
int_max_of_matrix(void)
 | 
						|
{
 | 
						|
  Term t = YAP_ARG1;
 | 
						|
  YAP_UInt dim = YAP_ArityOfFunctor(YAP_FunctorOfTerm(t)), i, pos;
 | 
						|
  YAP_Int *mat = (YAP_Int *)malloc( dim*sizeof(YAP_Int) ), max;
 | 
						|
 | 
						|
  if (!mat)
 | 
						|
    return FALSE;
 | 
						|
  if (!YAP_ArgsToIntArray(t, dim, mat))
 | 
						|
    return FALSE;
 | 
						|
  
 | 
						|
  max = mat[0];
 | 
						|
  pos = 0;
 | 
						|
  for (i = 1; i < dim; i++) {
 | 
						|
    if (mat[i] > max) {
 | 
						|
      max = mat[i];
 | 
						|
      pos = i;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  return YAP_unify(YAP_ARG2, YAP_MkIntTerm(min)) &&
 | 
						|
    YAP_unify(YAP_ARG3, YAP_MkIntTerm(pos));
 | 
						|
}
 | 
						|
 | 
						|
static int
 | 
						|
float_max_of_matrix(void)
 | 
						|
{
 | 
						|
  Term t = YAP_ARG1;
 | 
						|
  YAP_UInt dim = YAP_ArityOfFunctor(YAP_FunctorOfTerm(t)), i, pos;
 | 
						|
  YAP_Float *mat = (YAP_Float *)malloc( dim*sizeof(YAP_Float) ), max;
 | 
						|
 | 
						|
  if (!mat)
 | 
						|
    return FALSE; 
 | 
						|
 if (!YAP_ArgsToFloatArray(t, dim, mat))
 | 
						|
    return FALSE;
 | 
						|
  
 | 
						|
  max = mat[0];
 | 
						|
  pos = 0;
 | 
						|
  for (i = 1; i < dim; i++) {
 | 
						|
    if (mat[i] > max) {
 | 
						|
      max = mat[i];
 | 
						|
      pos = i;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  return YAP_unify(YAP_ARG2, YAP_MkFloatTerm(min)) &&
 | 
						|
    YAP_unify(YAP_ARG3, YAP_MkIntTerm(pos));
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
init_matrices(void)
 | 
						|
{
 | 
						|
  YAP_UserCPredicate("int_max_of_matrix", int_max_of_matrix, 3);
 | 
						|
  YAP_UserCPredicate("float_max_of_matrix", float_max_of_matrix, 3);
 | 
						|
  YAP_UserCPredicate("int_min_of_matrix", int_min_of_matrix, 3);
 | 
						|
  YAP_UserCPredicate("float_min_of_matrix", float_min_of_matrix, 3);
 | 
						|
}
 | 
						|
 | 
						|
#ifdef _WIN32
 | 
						|
 | 
						|
int WINAPI PROTO(win_matrices, (HANDLE, DWORD, LPVOID));
 | 
						|
 | 
						|
int WINAPI win_matrices(HANDLE hinst, DWORD reason, LPVOID reserved)
 | 
						|
{
 | 
						|
  switch (reason) 
 | 
						|
    {
 | 
						|
    case DLL_PROCESS_ATTACH:
 | 
						|
      break;
 | 
						|
    case DLL_PROCESS_DETACH:
 | 
						|
      break;
 | 
						|
    case DLL_THREAD_ATTACH:
 | 
						|
      break;
 | 
						|
    case DLL_THREAD_DETACH:
 | 
						|
      break;
 | 
						|
    }
 | 
						|
  return 1;
 | 
						|
}
 | 
						|
#endif
 |