让我们从一个谓词开始对元素进行分类。关于什么
item_t(item(_), true).
item_t(other(_), false).
请注意,此谓词对其真值有一个额外的参数。它只接受item(_)
orother(_)
元素。如果出现类似的东西,它会完全失败unfit(x)
。takeWhilet/3
现在想象一下,我们有一个我们现在可以写的谓词
?- takeWhilet(item_t, [item(a), item(b), item(c), other(d), other(e)], Xs).
takeWhilet(_P_1, [], []).
takeWhilet(P_1, [E|_], []) :-
call(P_1, E, false).
takeWhilet(P_1, [E|Es], [E|Fs]) :-
call(P_1, E, true),
takeWhilet(P_1, Es, Fs).
更漂亮地使用library(reif)
s if_/3
:
takeWhilet(_P_1, [], []).
takeWhilet(P_1, [E|Es], Fs0) :-
if_( call(P_1, E)
, ( Fs0 = [E|Fs], takeWhilet(P_1, Es, Fs) )
, Fs0 = [] ).
现在,我们可以other_t/2
类似地定义...