List 计算并删除列表中第一个元素的连续出现次数
我想计算并删除列表中第一个元素的连续出现次数List 计算并删除列表中第一个元素的连续出现次数,list,prolog,List,Prolog,我想计算并删除列表中第一个元素的连续出现次数 ?- count([1,1,1,2,2,1], N, X, L). N = 3, X = 1, L = [2,2,1]. % expected answer 我试试这个: count([],0,_,[]). count([X|T],N,X,L) :- !, select(X,[X|T],K), L is K, count(T,N1,X,L), N is N1+1. 热切的尝试: co
?- count([1,1,1,2,2,1], N, X, L).
N = 3, X = 1, L = [2,2,1]. % expected answer
我试试这个:
count([],0,_,[]).
count([X|T],N,X,L) :-
!,
select(X,[X|T],K),
L is K,
count(T,N1,X,L),
N is N1+1.
热切的尝试:
count([X,X|T],N,X,L) :-
!, count([X|T],M,X,L), N is M+1.
count([X|T],1,X,T) :- !.
count(L,0,_,L).
屈服
?- count([1,1,1,2,2,1], N, X, L).
N = 3,
X = 1,
L = [2, 2, 1].
编辑因为我们有一个整数域,所以尝试用CLP(FD)-mixed(?)来编程
initials_count([X,X|T],N,X,L) :-
N #= M+1,
initials_count([X|T],M,X,L).
initials_count([X|T],N,E,T) :-
N #<==> X #= E.
(使用SWI Prolog进行测试)
在Gnuplog中,应该是
initials_count([X|T],N,E,T) :-
N #<=> X #= E.
以下是您如何使用和执行此操作: 请注意,
count/4
同样可以处理包含非整数的列表:
?- count([a,a,a,b,b,c], N, X, L).
N = 3, X = a, L = [b,b,c].
您对计数([1,1,1,2],N,X,L)的期望值是多少?我不明白为什么在你的例子中,
L
不是[1,2,2]
。对于count([1,1,1,2],N,X,L),我希望L=[2],N=3,X=1,这意味着我们有3次1,在我的例子中我们有3次1,如果我们从列表中删除所有这些,我们将有L=[2,2,1]。那么count([1,2],N,X,L)
?真的L=[2]
?是的,L=[2],X=1,N=1,对于count([1]),我们将使用L=[],N=1,X=1。您的代码select(X[X | T],K)
非常奇怪:select/3通常使用select(X,Domain,Without_X)调用,也就是说,X在域列表中的位置未知。最后,它把L减少到T。没有别的了!?-计数([1,1,1,2,2,1],N,X,L)。未捕获异常:错误(存在错误(过程,dif/2),启动不带/2)|-您使用的是什么Prolog?GNU?我提出的答案是可行的,但问题是L,我不能正确地得到L。都是最大确定的!这两种定义在以下情况下都不正确:?-count([a],0,a,L)。
和?-initials_count([1],0,2,[])。
initials_count([X|T],N,E,T) :-
N #<=> X #= E.
count(L,0,E,L) :- L == [] ; L == [F|_], F \== E.
count([], 0, _, []).
count([E|Es], N, E, L) :-
skip_(Es, 1,N, E, L).
skip_([], N,N, _, []).
skip_([E|Es], N0,N, X, Xs) :-
if_(E = X,
( N1 is N0+1, skip_(Es,N1,N,X,Xs) ),
( N0 = N, Xs = [E|Es] )).
?- count([1,1,1,2], N, X, L).
N = 3, X = 1, L = [2].
?- count([1,1,1,2,2,1], N, X, L).
N = 3, X = 1, L = [2,2,1].
?- count([1], N, X, L).
N = X, X = 1, L = [].
?- J = [_,_,_], count(J, N, X, L).
J = [X, X, X], N = 3, L = []
; J = [X, X,_A], N = 2, L = [_A] , dif(_A,X)
; J = [X,_A,_B], N = 1, L = [_A,_B], dif(_A,X).
?- count([a,a,a,b,b,c], N, X, L).
N = 3, X = a, L = [b,b,c].