2016-05-31 2 views
0

述語を書く必要があります:YがX の各要素からなるリストである場合にtrue(double([a 、b]、[a、a、b、b])が真である)。別のリストの各要素からなるリストが2回繰り返されるProlog

私はこのようなSTHで終わった:のようなリストのための細かい作業

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

その[A、B]が、それは...助けてくださいはずの。

また、YがX の各要素からなるリストである場合、repeat([a、b]、[a 、a、a、b、b、b]、3)が真である)。リピート/ 3のために[OK]を

+0

ヒント: '[H、H | T]'はリストの先頭に 'H 'が2回現れるリストを表します。 – lurker

+0

'double([X | Xs]、[X、X | Ys]): - double(Xs、Ys) double([]、[])。 '働く、ありがとう。しかし、繰り返し述語は何ですか? – Troley

+0

他の述語について...別の質問を掲示するのはどうですか? – repeat

答えて

2
double([],[]). 
double([I|R],[I,I|RD]) :- 
    double(R,RD). 
0

私はこのようなかなっています:

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). 
+0

*非常に脆い。インスタンス化が不十分な場合、コードは公正な警告なしに論理的に間違った答えを返します... – repeat

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). 
01公正列挙についてどのように

 
?- 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) 
... 

サンプルSICStusプロローグ4.3.2を使用してを照会しますか? [A,B,C,D,E,F]は、同じ長さの実行に分割することができますどのように

 
?- 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) 
... 

 
?- 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:回答は、読みやすさを向上させるために再フォーマットされました。

関連する問題