Prolog removing all variables and duplicates

I need a query, which will remove me all variables and duplicates from list.

Example:

?- L = [1,2,3,X,Y,3,2], my_awesome_predicate(L, Res).

Then, Res should be: [1,2,3].

I don't care about order (it could be [2,3,1], [3,2,1] or whatever).

Unfortunately, I have a task in which I have to care about efficiency, so my main question is - can it be done faster? Currently, I have the following code:

remove_variables([], []).
remove_variables([H|List], Res):- var(H), !, remove_variables(List, Res).
remove_variables([H|List], [H|Res]):- remove_variables(List, Res).

my_awesome_predicate([], []).
my_awesome_predicate(List, Res):-
  sort(List, Sorted),
  remove_variables(Sorted, Res).

Answers


If you are using SWI then you can improve a little further with this code:

my_awesome_predicate(List, Res):-
  sort(List, MRes),
  remove_variables(MRes, Res).

remove_variables([Var|Tail], NTail):-
  var(Var),
  !,
  remove_variables(Tail, NTail).
remove_variables(Res, Res).

as it seems that SWI's sort will leave unbounded variables first (don't know if this behavior is a standard among other prolog's), so you can stop removing variables once you find the first non-variable.

Reading a bit SWI's documentation, it's stated that:

4.7.1 Standard Order of Terms

Comparison and  unification of arbitrary  terms.   Terms are ordered  in
the so called ``standard order''.  This order is defined as follows:

 1. Variables < Numbers < Atoms < Strings < Compound Terms

so it seems safe to stop removing elements when you find the first non-variable...


Need Your Help

Removing next Element - Javascript

javascript jquery element removeclass removechild

The button is on this TR and i can easily remove it with the following code. How do i remove the NEXT TR

About UNIX Resources Network

Original, collect and organize Developers related documents, information and materials, contains jQuery, Html, CSS, MySQL, .NET, ASP.NET, SQL, objective-c, iPhone, Ruby on Rails, C, SQL Server, Ruby, Arrays, Regex, ASP.NET MVC, WPF, XML, Ajax, DataBase, and so on.