这个答案基于两件事:第一,猜测。第二,if_/3 https://stackoverflow.com/a/27358600/4609915通过@false。
让我们定义一下
这元谓词 /questions/tagged/meta-predicate count_left_while2/4
.
count_left_while2(P_2,Xs,Ys,N)
计数
号码N
的相应列表项Xs
and Ys
充实的P_2
。从左到右依次进行,count_left_while2
停在前两项不满足的地方P_2
。当一个列表为空而另一个列表不是空时,它也会停止。
:- use_module(library(clpfd)).
:- meta_predicate count_left_while2(2,?,?,?).
count_left_while2(P_2,Xs,Ys,N) :-
N #>= 0,
list_list_countleft_while(Xs,Ys,N,P_2).
nil_or_cons([]).
nil_or_cons([_|_]).
:- meta_predicate list_list_countleft_while(?,?,?,2).
list_list_countleft_while([],Xs,0,_) :-
nil_or_cons(Xs).
list_list_countleft_while([X|Xs],Ys,N,P_2) :-
list_list_prev_countleft_while(Ys,Xs,X,N,P_2).
:- meta_predicate list_list_prev_countleft_while(?,?,?,?,2).
list_list_prev_countleft_while([],_,_,0,_).
list_list_prev_countleft_while([Y|Ys],Xs,X,N,P_2) :-
if_(call(P_2,X,Y),
( N0 #>= 0, N #= N0+1, list_list_countleft_while(Xs,Ys,N0,P_2) ),
N = 0).
让我们将它与具体化术语相等谓词结合使用(=)/3 https://stackoverflow.com/a/27358600/4609915, 像这样:
:- count_left_while2(=,[1,2,4,5],[1,2,3],N).
N = 2.