从术语/目标列表中查找成功次数



我已经编写了以下谓词exactly/2,如果列表L中的数字的N恰好等于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

我想创建类似的东西,但对于谓词:如果列表L中的N目标完全成功,我想编写一个成功的谓词。

例如,调用exactly(X, [true, false, member(1, [1, 2, 3]), member(0, [1, 2, 3])])应该将X绑定到2

实际上,这是可以做到的,如下代码所示:

:- module exactly.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is det.
:- implementation.
:- import_module int.
:- import_module list.
main(!IO) :-
Test1 = list_member(1, [1, 2, 3]),
Test2 = list_member(0, [1, 2, 3]),
Tests = [Test1, Test2],
exactly(N, Tests),
io.write_line(N, !IO).
:- pred exactly(int::out, list((pred))::in(list_skel((pred) is semidet)))
is det.
exactly(0, []).
exactly(N, [Test | Tests]) :-
exactly(NTail, Tests),
( if Test then
N = NTail + 1
else
N = NTail
).
:- pred list_member(T::in, list(T)::in) is semidet.
list_member(E, L) :-
list.member(E, L).

谓词list_member告诉编译器list.member。至于真与假,你会还需要定义这些名称的谓词。(默认情况下,它们只是作为目标而存在。(

最新更新