meta predicate - Prolog binding arguments -
in sicstus prolog, there's predicate:
maplist(:pred, +list)
pred
supposed take 1 argument - list
element. how can pass 2-argument predicate, first argument defined? in other languages written as:
maplist(pred.bind(somevalue), list)
maplist(p_1, xs)
call call(p_1, x)
each element of xs
. built-in predicate call/2
adds 1 further argument p_1
, calls call/1
. indicate further argument needed, helpful use name p_1
meaning "one argument needed".
so if have predicate of arity 2, say, (=)/2
, pass =(2)
maplist:
?- maplist(=(2), xs). xs = [] ; xs = [2] ; xs = [2,2] ...
since definition in sicstus' library unfortunately, incorrect, rather use following definition:
:- meta_predicate(maplist(1,?)). :- meta_predicate(maplist_i(?,1)). maplist(p_1, xs) :- maplist_i(xs, p_1). maplist_i([], _p_1). maplist_i([e|es], p_1) :- call(p_1, e), maplist_i(es, p_1).
see this answer more.
just nice further example lists of lists.
?- xss = [[a],[b,c]], maplist(maplist(=(e)), xss). xss = [[e], [e, e]], = b, b = c, c = e.
Comments
Post a Comment