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
							 |