new support for join/intersect operations

git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@2086 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
ricroc
2008-02-11 17:00:23 +00:00
parent d39002c271
commit 1ac399f57b
8 changed files with 496 additions and 96 deletions

View File

@@ -40,6 +40,10 @@ static int p_trie_check_entry(void);
static int p_trie_get_entry(void);
static int p_trie_remove_entry(void);
static int p_trie_remove_subtree(void);
static int p_trie_join(void);
static int p_trie_intersect(void);
static int p_trie_count_join(void);
static int p_trie_count_intersect(void);
static int p_trie_save(void);
static int p_trie_load(void);
static int p_trie_stats(void);
@@ -73,6 +77,10 @@ void init_tries(void) {
YAP_UserCPredicate("trie_get_entry", p_trie_get_entry, 2);
YAP_UserCPredicate("trie_remove_entry", p_trie_remove_entry, 1);
YAP_UserCPredicate("trie_remove_subtree", p_trie_remove_subtree, 1);
YAP_UserCPredicate("trie_join", p_trie_join, 2);
YAP_UserCPredicate("trie_intersect", p_trie_intersect, 2);
YAP_UserCPredicate("trie_count_join", p_trie_count_join, 3);
YAP_UserCPredicate("trie_count_intersect", p_trie_count_intersect, 3);
YAP_UserCPredicate("trie_save", p_trie_save, 2);
YAP_UserCPredicate("trie_load", p_trie_load, 2);
YAP_UserCPredicate("trie_usage", p_trie_usage, 4);
@@ -354,6 +362,86 @@ static int p_trie_remove_subtree(void) {
#undef arg_ref
/* trie_join(-TrieDest,-TrieSource) */
#define arg_trie_dest YAP_ARG1
#define arg_trie_source YAP_ARG2
static int p_trie_join(void) {
/* check args */
if (!YAP_IsIntTerm(arg_trie_dest))
return FALSE;
if (!YAP_IsIntTerm(arg_trie_source))
return FALSE;
/* join trie */
trie_join(TRIE_ENGINE, (TrNode) YAP_IntOfTerm(arg_trie_dest), (TrNode) YAP_IntOfTerm(arg_trie_source), NULL, NULL);
return TRUE;
}
#undef arg_trie_dest
#undef arg_trie_source
/* trie_intersect(-TrieDest,-TrieSource) */
#define arg_trie_dest YAP_ARG1
#define arg_trie_source YAP_ARG2
static int p_trie_intersect(void) {
/* check args */
if (!YAP_IsIntTerm(arg_trie_dest))
return FALSE;
if (!YAP_IsIntTerm(arg_trie_source))
return FALSE;
/* intersect trie */
trie_intersect(TRIE_ENGINE, (TrNode) YAP_IntOfTerm(arg_trie_dest), (TrNode) YAP_IntOfTerm(arg_trie_source), NULL, NULL);
return TRUE;
}
#undef arg_trie_dest
#undef arg_trie_source
/* trie_count_join(-Trie1,-Trie2,+Entries) */
#define arg_trie1 YAP_ARG1
#define arg_trie2 YAP_ARG2
#define arg_entries YAP_ARG3
static int p_trie_count_join(void) {
YAP_Int entries;
/* check args */
if (!YAP_IsIntTerm(arg_trie1))
return FALSE;
if (!YAP_IsIntTerm(arg_trie2))
return FALSE;
/* count join trie */
entries = trie_count_join((TrNode) YAP_IntOfTerm(arg_trie1), (TrNode) YAP_IntOfTerm(arg_trie2));
return YAP_Unify(arg_entries, YAP_MkIntTerm(entries));
}
#undef arg_trie1
#undef arg_trie2
#undef arg_entries
/* trie_count_intersect(-Trie1,-Trie2,+Entries) */
#define arg_trie1 YAP_ARG1
#define arg_trie2 YAP_ARG2
#define arg_entries YAP_ARG3
static int p_trie_count_intersect(void) {
YAP_Int entries;
/* check args */
if (!YAP_IsIntTerm(arg_trie1))
return FALSE;
if (!YAP_IsIntTerm(arg_trie2))
return FALSE;
/* count intersect trie */
entries = trie_count_intersect((TrNode) YAP_IntOfTerm(arg_trie1), (TrNode) YAP_IntOfTerm(arg_trie2));
return YAP_Unify(arg_entries, YAP_MkIntTerm(entries));
}
#undef arg_trie1
#undef arg_trie2
#undef arg_entries
/* trie_save(-Trie,-FileName) */
#define arg_trie YAP_ARG1
#define arg_file YAP_ARG2