Counting in a Prolog List -
i'm trying make prolog function (i know it's not function can't recall it's name) given list , number n returns list elements repeat @ least n times.
xpto(['a', 'a', 'a', 'b', 'b', 'c'], out, 3) should return out = ['a']
xpto(['a', 'a', 'a', 'b', 'b', 'c'], out, 2) should return out = ['a', 'b']
etc.
i have:
xpto([], _, _). xpto([h | l], o, num) :- count(h, [h | l], n), n = num, xpto(l, [h | o], num). xpto([h | l], o, num) :- count(h, [h | l], n), n \= num, xpto(l, o, num).
where in count(a, l, n) n number of times repeats in l, doesn't work. i'm pretty sure algorithm works on paper.
any appreciated :)
if prolog system supports clpfd, use following implementation of xpto/3
. implementation preserves logical-purity!
let's implement xpto/3
based on list_counts/2
, meta-predicates tfilter/3
, maplist/3
, , on (#=<)/3
. (#=<)/3
reified version of constraint (#=</2)
.
:- use_module(library(clpfd)). :- use_module(library(lambda)). xpto(xs,ys,n) :- list_counts(xs,css0), tfilter(n+\ (_-v)^(n #=< v),css0,css1), maplist(\ (k-_)^k^true,css1,ys).
let's run queries gave in questions:
?- xpto([a,a,a,b,b,c],out,3). out = [a]. % succeeds deterministically ?- xpto([a,a,a,b,b,c],out,2). out = [a,b]. % succeeds deterministically
as code used in implementation monotone, can ask quite general queries , still logically sound answers:
?- xpto([a,a,a,b,b,c],out,n). out = [], n in 4..sup ; out = [a], n = 3 ; out = [a,b], n = 2 ; out = [a,b,c], n in inf..1 .
now answers if first argument contains variables?
?- xs = [_,_],xpto(xs,out,n). xs = [_a,_a], out = [], n in 3..sup ; xs = [_a,_a], out = [_a], n in inf..2 ; xs = [_a,_b], out = [], n in 2..sup, dif(_a,_b) ; xs = [_a,_b], out = [_a, _b], n in inf..1, dif(_a,_b) .
Comments
Post a Comment