Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Prolog中列表中的重复元素_List_Prolog - Fatal编程技术网

List Prolog中列表中的重复元素

List Prolog中列表中的重复元素,list,prolog,List,Prolog,如果两个元素重复相同的次数,我想找到一种方法来查找列表中重复次数最多的元素。我希望谓词是包含这两个元素的列表。我该怎么做 示例查询和预期答案: ?- maxRepeated([1,3,3,4,2,2],X). X = [3,2]. % common case: there is one element that is the most repeated ?- maxRepeated([1,3,3,3,3,4,2,2],X). X = [3]. % all elements repeat th

如果两个元素重复相同的次数,我想找到一种方法来查找列表中重复次数最多的元素。我希望谓词是包含这两个元素的列表。我该怎么做

示例查询和预期答案:

?- maxRepeated([1,3,3,4,2,2],X).
X = [3,2].

% common case: there is one element that is the most repeated
?- maxRepeated([1,3,3,3,3,4,2,2],X).
X = [3].

% all elements repeat the same number of times
?- maxRepeated([1,3,4,2],X).
X = [1,3,4,2].

对于较少重复的元素,我也有同样的问题。

我对prolog了解不多,可能有一种方法可以做得更好,但这里有一个有效的解决方案:SWI prolog

%List of tuples, keeps track of the number of repetitions.
modify([],X,[(X,1)]).
modify([(X,Y)|Xs],X,[(X,K)|Xs]):- K is Y+1.
modify([(Z,Y)|Xs],X,[(Z,Y)|K]):- Z =\= X, modify(Xs,X,K).

highest((X1,Y1),(_,Y2),(X1,Y1)):- Y1 >= Y2.
highest((_,Y1),(X2,Y2),(X2,Y2)):- Y2 > Y1.

maxR([X],X).
maxR([X|Xs],K):- maxR(Xs,Z),highest(X,Z,K).

rep([],R,R).
rep([X|Xs],R,R1):-modify(R,X,R2),rep(Xs,R2,R1).

maxRepeated(X,R):- rep(X,[],K),maxR(K,R).


?- maxRepeated([1,3,3,4,3,2] ,X).
X = (3, 3) .

?- maxRepeated([1,2,3,4,5,6] ,X).
X = (1, 1) .
较少重复的元素是类似的


我认为在这种情况下使用元组更好,但是将结果更改为列表应该不会有问题

在Visual Prolog上有我的解决方案:

domains
value=integer
tuple=t(value,integer)
list=value*
tuples=tuple*

predicates
modify(tuples,value,tuples)
highest(tuple,tuple,tuple)
maxR(tuples,integer,integer)
maxR(tuples,integer)
rep(list,tuples,tuples)
maxRepeated(list,list)
filter(tuples,integer,list)

clauses
modify([],X,[t(X,1)]):- !.
modify([t(X,Y)|Xs],X,[t(X,K)|Xs]):- K = Y+1, !.
modify([t(Z,Y)|Xs],X,[t(Z,Y)|K]):- Z <> X, modify(Xs,X,K).

highest(t(X1,Y1),t(_,Y2),t(X1,Y1)):- Y1 >= Y2, !.
highest(t(_,Y1),t(X2,Y2),t(X2,Y2)):- Y2 > Y1.

maxR([],R,R):- !.
maxR([t(_,K)|Xs],Rs,R):- K>Rs,!, maxR(Xs,K,R).
maxR([_|Xs],Rs,R):- maxR(Xs,Rs,R).
maxR(X,R):- maxR(X,0,R).

rep([],R,R).
rep([X|Xs],R,R1):-modify(R,X,R2),rep(Xs,R2,R1).

filter([],_,[]):-!.
filter([t(X,K)|Xs],K,[X|FXs]):- !, filter(Xs,K,FXs).
filter([_|Xs],K,FXs):- filter(Xs,K,FXs).

maxRepeated(X,RL):- rep(X,[],Reps),maxR(Reps,K),filter(Reps,K,RL).

goal
maxRepeated([1,3,3,4,2,3,2,2] ,X),
maxRepeated([1,2,3,4,5,6] ,Y).
在这个答案中出现的/2中的谓词mostcommonitems_与 最常见的项目在/2中

在以下情况下,我们使用、和:

让我们运行一些查询

首先,OP提出的三个问题:

?- mostcommonitems_in(Xs,[1,3,3,4,2,2]). Xs = [3,2]. ?- mostcommonitems_in(Xs,[1,3,3,3,3,4,2,2]). Xs = [3]. ?- mostcommonitems_in(Xs,[1,3,4,2]). Xs = [1,3,4,2]. 下面这个更一般的查询怎么样


上面的查询破坏了几乎所有的不纯代码。。。我们的Prolog代码是纯的,所以我们可以继续

这是家庭作业吗?你有没有尝试过解决办法?另外,重复的元素总是连续的吗?例如,关于[1,3,2,1,3,3,1,4,1]呢?这是我试图开发的一个项目,它基于一些与我在课堂上看到的内容相关的东西。我只知道如何得到一个结果,但不知道如何得到一个列表。不,元素并不总是连续的。谢谢你的帮助answer@user3657716您解决问题了吗?此解决方案不满足要求:maxRepeated[1,3,3,4,2,2],X.X=[3,2],但将结果更改为列表应该不会有问题。这是一个微不足道的操作。你复制我的答案,然后投否决票。你的想象力在哪里?你的创造力在哪里?我从来没有见过像你这样的人。不,不是我。我的名声太小了。对于否决票,需要125。这似乎是我的答案,但更详细。你不觉得吗?就连这些条款的名称都很常见。我想是的,不要隐瞒。但我的版本解决了问题,不像你的版本。我使用了您的代码,在VisualProlog上运行时,我实现了所需的算法。 ?- mostcommonitems_in(Xs,[1,3,3,4,2,2]). Xs = [3,2]. ?- mostcommonitems_in(Xs,[1,3,3,3,3,4,2,2]). Xs = [3]. ?- mostcommonitems_in(Xs,[1,3,4,2]). Xs = [1,3,4,2]. ?- mostcommonitems_in(Xs,[1,3,2,1,3,3,1,4,1]). Xs = [1]. ?- mostcommonitems_in(Xs,[1,3,3,4,3,2]). Xs = [3]. ?- mostcommonitems_in(Xs,[1,2,3,4,5,6]). Xs = [1,2,3,4,5,6]. ?- mostcommonitems_in(Xs,[1,3,3,4,2,3,2,2]). Xs = [3,2].
?- mostcommonitems_in(Xs,[a,b,c,a,b,c,a,b,c,x,d,e]).
Xs = [a,b,c].                                          % works as expected 
?- mostcommonitems_in(Xs,[A,B,C]).
  Xs = [C]    ,     A=B           ,     B=C
; Xs = [B]    ,     A=B           , dif(B,C)
; Xs = [C]    ,               A=C , dif(B,C)
; Xs = [C]    ,           dif(A,C),     B=C
; Xs = [A,B,C], dif(A,B), dif(A,C), dif(B,C).