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].