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