:- use_module(library(tor_clpfd)).
:- use_module(library(tor)).
:- use_module(library(mutable_variables)).

% Tests the Prolog pack (version 1.0.2)

%%% Serves as basic illustration of features that are new in version 1.0.2 %%%
translate_dbs(HandlerLeft, HandlerRight,HandlerLeftHeadVar,HandlerRightHeadVar) :-
  clause(dbs_tree(D), Body),
  translate(dbs_tree(D), Body, HandlerLeft, HandlerRight, HandlerLeftHeadVar, HandlerRightHeadVar,_DiffPos).
translate_dibs(HandlerLeft, HandlerRight,HandlerLeftHeadVar,HandlerRightHeadVar) :-
  clause(dibs_tree(D), Body),
  translate(dibs_tree(D), Body, HandlerLeft, HandlerRight, HandlerLeftHeadVar, HandlerRightHeadVar,_DiffPos).
translate_id(HandlerLeft, HandlerRight, HandlerLeftHeadVar, HandlerRightHeadVar) :-
  clause(id(Depth,PruneVar),Body),
  translate(id(Depth,PruneVar), Body, HandlerLeft, HandlerRight, HandlerLeftHeadVar, HandlerRightHeadVar,_DiffPos).
translate_bab(HandlerLeft, HandlerRight, HandlerLeftHeadVar, HandlerRightHeadVar) :-
  clause(bab(Objective, BestVar, Current),Body),
  translate(bab(Objective, BestVar, Current), Body, HandlerLeft, HandlerRight, HandlerLeftHeadVar, HandlerRightHeadVar,_DiffPos).
translate_nbs(HandlerLeft, HandlerRight, HandlerLeftHeadVar, HandlerRightHeadVar) :-
  clause(nbs_tree(Var), Body),
  translate(nbs_tree(Var), Body, HandlerLeft, HandlerRight, HandlerLeftHeadVar, HandlerRightHeadVar,_DiffPos).

translate_log(HandlerLeft, HandlerRight, HandlerLeftHeadVar, HandlerRightHeadVar) :-
  clause(log_tree, Body),
  translate(log_tree, Body, HandlerLeft, HandlerRight, HandlerLeftHeadVar, HandlerRightHeadVar,_DiffPos).

setup_vars(Xs) :-
  length(Xs,5),
  Xs ins 1..10.

setup_vars2(Xs) :-
  length(Xs,2),
  Xs ins 1..5.

test_dbs(Xs) :-
  setup_vars(Xs),
  search(tor_merge(dbs_tree(10),tor_label(Xs))).


test_dibs(Xs) :-
  setup_vars(Xs),
  search(tor_merge(dibs_tree(5),tor_label(Xs))).


test_id(Xs) :-
  setup_vars2(Xs),
  search(id(tor_label(Xs))).

test_nbs(Xs) :-
  setup_vars(Xs),
  search(nbs(500,tor_label(Xs))).


test_bab(Xs) :-
 Xs = [First,Second],
 Xs ins 1..10,
 Objective #= (First + Second),
 Objective #> 3,
 search(bab(Objective,tor_label(Xs))).