List 用特定列表替换列表中的每个元素
我试图定义replaceEltByclass(E1:list,E2:list)E是一个没有子列表的列表。属于C类的E1的每个元素都由 元素C。最终结果放入E2。例如,目标代表类([e1,e4,e6,e11],E2)将提供列表E2:[e1,e8,e10],e4,[e3,e6,e7],e11]。我没有好的结果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([]
/*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谓词的必要性。