Prolog 序言,计数器

Prolog 序言,计数器,prolog,counter,Prolog,Counter,我想在两个列表(相同长度)中计算相同位置的相等元素数。 例如: 假设我们有A=[3,6,7,9]和B=[2,6,4,9]的列表,我想在屏幕上打印消息“2头公牛被发现” 到目前为止,我已经做到了: bulls([],[]). bulls([Ha|Ta],[Hb|Tb]) :- Ha = Hb, writeln('bull found'), bulls(Ta,Tb); bulls(Ta,Tb). 每当两个列表中存在相同位置的元素时,都会打印消息“bull found

我想在两个列表(相同长度)中计算相同位置的相等元素数。 例如: 假设我们有A=[3,6,7,9]和B=[2,6,4,9]的列表,我想在屏幕上打印消息“2头公牛被发现”

到目前为止,我已经做到了:

bulls([],[]).
bulls([Ha|Ta],[Hb|Tb]) :-
    Ha = Hb,
    writeln('bull found'),
    bulls(Ta,Tb);
    bulls(Ta,Tb).
每当两个列表中存在相同位置的元素时,都会打印消息“bull found”。 在我看来,我想做这样的事情:

bulls([],[],_).
bulls([Ha|Ta],[Hb|Tb],Counter) :-
    Ha = Hb,
    NewCounter is Counter + 1,
    bulls(Ta,Tb,NewCounter);
    bulls(Ta,Tb,NewCounter).

bulls(List1,List2):- bulls(List1,List2,0).
bulls([],[],X) :- write(X), write(' bulls found').
bulls
是从另一个通过两个列表的规则调用的。 如何使其在屏幕上显示“多头”的值。有什么帮助吗


编辑 所以在Suki的帖子之后,我制作了这个测试程序测试2个列表:

bulls([],[],X), write(X), write('bulls found'),fail.
bulls([Ha|Ta],[Hb|Tb],Counter) :-
    Ha = Hb,
    NewCounter is Counter + 1,
    bulls(Ta,Tb,NewCounter);
    bulls(Ta,Tb,NewCounter).

check(List1,List2):- 
    bulls(List1,List2,0).


start:-
    A=[1,1,1,1],
    B=[2,1,2,1],
    writeln(A),writeln(B),
    check(A,B).
我得到了这个结果

1 ?- start.
[1,1,1,1]
[2,1,2,1]
ERROR: bulls/3: Arguments are not sufficiently instantiated

我做错了什么?

关于您编辑的程序:

第一条不是条款,而是目标!应该是这样的:

bulls([],[],_).
bulls([Ha|Ta],[Hb|Tb],Counter) :-
    Ha = Hb,
    NewCounter is Counter + 1,
    bulls(Ta,Tb,NewCounter);
    bulls(Ta,Tb,NewCounter).

bulls(List1,List2):- bulls(List1,List2,0).
bulls([],[],X) :- write(X), write(' bulls found').
顺便说一句,您应该删除失败的

在第二个子句中,您需要使用“if then else”,并在“else”分支中使用
Counter
而不是
NewCounter


假设prolog实现中存在谓词findall、length、nth0:
(以下跟踪来自swi prolog)


谢谢你的帮助。不,我没有得到一个错误,但输出不是我所期望的。我开玩笑说我得到了
1?-开始。[1,1,1,1][2,1,2,1]错误。