计算两个列表中匹配元素的数量

时间:2014-12-25 16:19:59

标签: prolog

我有两个随机数的elemets列表。例如A = [1,2,4,5],B = [1,2,3]。结果应为2。 我试过的代码:

domains
Numbers1 = integer*
Numbers2 = integer*
int_list=integer*

predicates
nondeterm prinadl(integer, int_list)

clauses
   //here going the code that read number that I've entered, and according to entered numer,programm should do something
 answer(T):- T=5, 
    P = 0,
    write ("Enter the 1st list"), readterm (int_list, L),
    write ("Enter the 2nd list"), readterm (int_list, L2),
    L2 = [H|V], prinadl(H, L), P1 = P + 1,
    write(L2, P1, V).

 prinadl (X, L):- L=[X|_], !.
 prinadl (X, L):- L=[_|T], prinadl (X, T).

我对prolog很新。你能告诉我我哪里错了吗?我需要的只是将打印的数量打印到控制台。 提前谢谢。

1 个答案:

答案 0 :(得分:2)

这个答案基于两件事:第一,猜测。第二,if_/3 by @false。

让我们来定义 count_left_while2/4

count_left_while2(P_2,Xs,Ys,N) 计数 NXs中相应列表项的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). 的项目。当一个列表为空时它也会停止,但另一个列表不是。

:- count_left_while2(=,[1,2,4,5],[1,2,3],N).
N = 2.

让我们将其与具体术语等式谓词(=)/3结合使用,如下所示:

|