Prolog 序言,计数器
我想在两个列表(相同长度)中计算相同位置的相等元素数。 例如: 假设我们有A=[3,6,7,9]和B=[2,6,4,9]的列表,我想在屏幕上打印消息“2头公牛被发现” 到目前为止,我已经做到了: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
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]错误。