From 6f6f578578e304776030a9a9d21261feedeeda3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20Santos=20Costa?= Date: Wed, 20 Feb 2013 13:10:20 -0600 Subject: [PATCH] fix not handling --- packages/bdd/trie_sp.yap | 44 +++++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/packages/bdd/trie_sp.yap b/packages/bdd/trie_sp.yap index 54cb43ccf..09ac6b616 100644 --- a/packages/bdd/trie_sp.yap +++ b/packages/bdd/trie_sp.yap @@ -7,12 +7,15 @@ :- use_module(library(rbtrees)). trie_to_bdd(Trie, BDD, MapList) :- - trie_to_list(Trie, Complex), - rb_new(Map0), - complex_to_andor(Complex,Map0,Map,Tree), - rb_visit(Map, MapList), - extract_vars(MapList, Vs), - bdd_new(Tree, Vs, BDD). + %trie_print(Trie), + trie_to_list(Trie, Complex), + %(numbervars(Complex,1,_), writeln(Complex), fail ; true ), + rb_new(Map0), + complex_to_andor(Complex,Map0,Map,Tree), + %(numbervars(Tree,1,_), writeln(Tree), fail ; true ), + rb_visit(Map, MapList), + extract_vars(MapList, Vs), + bdd_new(Tree, Vs, BDD). tabled_trie_to_bdd(Trie, BDD, MapList) :- trie_to_list(Trie, Complex), @@ -40,15 +43,28 @@ complex_to_andor([Els], Map0, MapF, V) :- complex_to_and(Els, Map0, MapF, V). complex_to_and(int(A1,[endlist]), Map0, MapF, V) :- !, - check(Map0, A1, V, MapF). + check(Map0, A1, V, MapF). complex_to_and(functor(not,1,[int(A1,[endlist])]), Map0, MapF, not(V)) :- !, - check(Map0, A1, V, MapF). -complex_to_and(int(A1,Els), Map0, MapF, and(V,T2)) :- - check(Map0, A1, V, MapI), - complex_to_andor(Els, MapI, MapF, T2). -complex_to_and(functor(not,1,[int(A1,Els)]), Map0, MapF, and(not(V),T2)) :- - check(Map0, A1, V, MapI), - complex_to_andor(Els, MapI, MapF, T2). + check(Map0, A1, V, MapF). +complex_to_and(int(A1,Els), Map0, MapF, and(V,T2)) :- !, + check(Map0, A1, V, MapI), + complex_to_andor(Els, MapI, MapF, T2). +complex_to_and(functor(not,1,[int(A1,Els)]), Map0, MapF, and(not(V),T2)) :- !, + check(Map0, A1, V, MapI), + complex_to_andor(Els, MapI, MapF, T2). +% HASH TABLE, it can be an OR or an AND. +complex_to_and(functor(not,1,[int(A1,Els)|More]), Map0, MapF, or(NOTV1,O2)) :- + check(Map0, A1, V, MapI), + (Els == [endlist] + -> + NOTV1 = not(V), + MapI = MapI2 + ; + complex_to_andor(Els, MapI, MapI2, T2), + NOTV1 = and(not(V), T2) + ), + complex_to_and(functor(not,1,More), MapI2, MapF, O2). + tabled_complex_to_andor(T, Map, Map, Tab, Tab, V) :- rb_lookup(T, V, Tab), !,