2016-09-23 17 views
1

replaceEltByclass(E1:リスト、E2:リスト)を定義しようとしています。Eはサブリストのないリストです。クラスCに属するE1の各要素は、Cの 要素に置き換えられます。最終結果はE2に入れられます。たとえば、目標rep_class([e1、e4、e6、e11]、E2)はリストE2を提供します:[[e1、e8、e10]、e4、[e3、e6、e7]、e11]。私は良い結果がありません。リストの各要素を特定のリストに置き換えます

/*The code*/ 
/*facts*/ 
class(c1,[e3, e6, e7]). 
class(c2,[e1, e8, e10]). 

/*rules*/ 

rep_class([],[]). 

rep_class([E|Q],E2) :- 
    class(C,L), 
    not(member(E,L)), 
    concat(E2,E,E2), 
    rep_class(Q,E2). 

rep_class([E|Q],E2) :- 
    class(C,L), 
    member(E,L), 
    concat(E2,L,E2), 
    rep_class(Q,E2). 


/*conventional concat*/ 
concat([],L,L). 
concat([H|T],L,[H|Res]) :- concat(T,L,Res). 

答えて

0

問題はである:C = C2場合には、2つの溶液いずれかを与え、それが去るときC = C1がL一の溶液と交換しますので、次に、例えばE1がC2に属しているため、class(C,L),not(member(E,L)),それをe1とする。あなたは「Cはそのようなメンバー(e1、L)が存在しますか?」と書く必要があります。あなたはすべての可能なリストを収集し、いくつかは、私のバージョンを変更するとだからメンバー(E1、L)はリストLの略かどうかを確認する必要がある。例として

class(c1,[e3, e6, e7]). 
class(c2,[e1, e8, e10]). 

rep_class([],[]). 

rep_class([E|Q],[E|E2]) :- 
    findall(L,class(_,L),List), 
    not(find(List,E,_)), 
    rep_class(Q,E2). 

rep_class([E|Q],[Lout|E2]) :- 
    findall(L,class(_,L),List), 
    find(List,E,Lout), 
    rep_class(Q,E2). 

find([Lin|_],E,Lin):-member(E,Lin). 
find([Lin|T],E,Lout):-not(member(E,Lin)),find(T,E,Lout). 

?- rep_class([e1,e4,e6,e11], E2). 
E2 = [[e1, e8, e10], e4, [e3, e6, e7], e11] ; 
false. 
+0

それは持っています正しい行動。私はまた、findall述語を使用する間違いと必要性を理解しています。 – Hana

関連する問題