List 用特定列表替换列表中的每个元素

List 用特定列表替换列表中的每个元素,list,replace,prolog,List,Replace,Prolog,我试图定义replaceEltByclass(E1:list,E2:list)E是一个没有子列表的列表。属于C类的E1的每个元素都由 元素C。最终结果放入E2。例如,目标代表类([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([]

我试图定义replaceEltByclass(E1:list,E2:list)E是一个没有子列表的列表。属于C类的E1的每个元素都由 元素C。最终结果放入E2。例如,目标代表类([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).

问题在于:
类(C,L),而不是(成员(E,L)),
因为它将给出两个解决方案,一个是C=C2,然后例如e1属于C2,因此它将用L替换它,另一个是C=C1时的一个解决方案,将其保留为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.

问题在于:
类(C,L),而不是(成员(E,L)),
因为它将给出两个解决方案,一个是C=C2,然后例如e1属于C2,因此它将用L替换它,另一个是C=C1时的一个解决方案,将其保留为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.

它有正确的行为。我也理解使用findall谓词的错误和必要性。它有正确的行为。我也理解错误和使用findall谓词的必要性。