Я написал следующий предикат exactly/2
, который завершается успешно, если ровно N
чисел в списке L
равны 1:
:- pred exactly(int, list(int)).
:- mode exactly(in, in) is semidet.
:- mode exactly(out, in) is det.
exactly(N, L) :-
length(filter(pred(X::in) is semidet :- (X = 1), L), N).
Например, вызов exactly(X, [1, 0, 0, 1, 0, 1])
свяжет X
с 3
.
Я хочу создать нечто подобное, но для предикатов: я хочу написать предикат, который будет успешным, если ровно N
цели из списка L
успешны.
Например, вызов exactly(X, [true, false, member(1, [1, 2, 3]), member(0, [1, 2, 3])])
должен связать X
с 2
.