:- module(tor_labeling,
	[ tor_label/1
	, ff_label/1
	]).

% :- use_module(library(tor)).
% :- use_module(library(clpfd)).

:- use_module(tor).
:- use_module(library(clpfd)).

tor_label([]).
tor_label([Var|Vars]) :-
  ( var(Var) ->
      fd_inf(Var,Value),
      (   Var #= Value, 
          tor_label(Vars) 
      tor Var #\= Value, 
          tor_label([Var|Vars])
      )
  ;
      tor_label(Vars)
  ).

ff_label([]).
ff_label([Var|Vars]) :-
  ( var(Var) ->
      clpfd:fd_size_(Var, n(Size)),
      clpfd:find_ff(Vars, Var, Size, TheVar),
      clpfd:delete_eq([Var|Vars], TheVar, RestVars),
      fd_inf(TheVar,Value),
      ( TheVar #= Value, 
        ff_label(RestVars) 
      tor TheVar #\= Value, 
        ff_label([TheVar|RestVars])
      )
  ;
      ff_label(Vars)
  ).
