Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why doesn't maplist/3 use a template?

The maplist/3 predicate has the following form

maplist(:Goal, ?List1, ?List2)

However the very similar function findall/3 has the form

findall(+Template, :Goal, -Bag)

Not only does it have a goal but a template as well. I've found this template to be quite useful in a number of places and began to wonder why maplist/3 doesn't have one.

Why doesn't maplist/3 have a template argument while findall/3 does? What is the salient difference between these predicates?

like image 961
Wheat Wizard Avatar asked Dec 23 '22 11:12

Wheat Wizard


1 Answers

Templates as in findall/3, setof/3, and bagof/3 are an attempt to simulate proper quantifications with Prolog's variables. Most of the time (and here in all three cases) they involve explicit copying of those terms within the template.

For maplist/3 such mechanisms are not always necessary since the actual quantification is here about the lists' elements only. Commonly, no further modification happens. Instead of using templates, the first argument of maplist/3 is an incomplete goal that lacks two further arguments.

maplist(Goal_2, Xs, Ys).

If you insist, you can get exactly your template version using library(lambda):

templmaplist(Template1, Template2, Goal_0, Xs, Ys) :-
   maplist(\Template1^Template2^Goal_0, Xs, Ys).

(Note that I avoid calling this maplist/5, since this is already defined with another meaning)

In general, I rather avoid making "my own templates" since this leads so easily to misunderstandings (already between me and me): The arguments are not the pure relational arguments one is usually expecting. By using (\)/1 instead, the local variables are somewhat better handled and more visible as being special.

... ah, and there is another good reason to rather avoid templates: They actually force you to always take into account some less-than-truly-pure mechanism as copying. This means that your program may expose some anomalies w.r.t. monotonicity. You really have to look into the very details.

On the other hand without templates, as long as there is no copying involved, even your higher-order predicates will maintain monotonicity like a charm.

like image 101
false Avatar answered Dec 31 '22 12:12

false