列表由另一个List的每个元素组成,重复两次Prolog

时间:2016-05-31 02:45:55

标签: list prolog

我必须写一个谓词:当Y是由X的每个元素组成的列表时,double(X,Y)为真  重复两次(例如双([a,b],[a,a,b,b])为真)。

我这样结束了:

double([],[]).
double([T],List) :- double([H|T],List).
double([H|T],List) :- count(H, List, 2).

它适用于像[a,a,b]这样的列表,但它不应该......请帮忙。

我需要另一个谓词的帮助:当Y是由X的每个元素组成的列表时,重复(X,Y,N)为真 重复N次(例如重复([a,b],[a,a,a,b,b,b],3)为真)。

3 个答案:

答案 0 :(得分:2)

return (<tr><th

答案 1 :(得分:1)

以下是您如何实现您在问题中建议的“重复”谓词:

:- use_module(library(clpfd)).

基于 if_/3 (=)/3 我们定义:

each_n_reps([E|Es], N) :-
   aux_n_reps(Es, E, 1, N).

aux_n_reps([], _, N, N).               % internal auxiliary predicate
aux_n_reps([E|Es], E0, N0, N) :-
   if_(E0 = E,
       ( N0 #< N, N1 #= N0+1 ),        % continue current run
       ( N0 #= N, N1 #= 1 )),          % start new run
   aux_n_reps(Es, E, N1, N).

使用SICStus Prolog 4.3.2进行样本查询 1

?- each_n_reps(Xs, 3).
   Xs = [_A,_A,_A]
;  Xs = [_A,_A,_A,_B,_B,_B]         , dif(_A,_B)
;  Xs = [_A,_A,_A,_B,_B,_B,_C,_C,_C], dif(_A,_B), dif(_B,_C)
...

公平的枚举怎么样?

?- length(Xs, _), each_n_reps(Xs, N).
   N = 1, Xs = [_A]
;  N = 2, Xs = [_A,_A]
;  N = 1, Xs = [_A,_B]      , dif(_A,_B)
;  N = 3, Xs = [_A,_A,_A]
;  N = 1, Xs = [_A,_B,_C]   , dif(_A,_B), dif(_B,_C)
;  N = 4, Xs = [_A,_A,_A,_A]
;  N = 2, Xs = [_A,_A,_B,_B], dif(_A,_B)
;  N = 1, Xs = [_A,_B,_C,_D], dif(_A,_B), dif(_B,_C), dif(_C,_D)
...

[A,B,C,D,E,F]怎样才能分成等长的跑步?

?- each_n_reps([A,B,C,D,E,F], N).
   N = 6,     A=B ,     B=C ,     C=D ,     D=E ,     E=F 
;  N = 3,     A=B ,     B=C , dif(C,D),     D=E ,     E=F
;  N = 2,     A=B , dif(B,C),     C=D , dif(D,E),     E=F
;  N = 1, dif(A,B), dif(B,C), dif(C,D), dif(D,E), dif(E,F).

脚注1 :重新格式化答案以提高可读性。

答案 2 :(得分:0)

好的重复/ 3我是这样的:

repeat1([],[],0).
repeat1([A|B],[X|T],Y):- repeat1(B,T,Z), Y is 1+Z.
repeat1([A1|B],[X1|T], Z) :- A1\=A, X1\=X, repeat1(B,T,Z).