【问题标题】:replacing each element of a list by a specific list用特定列表替换列表的每个元素
【发布时间】:2017-02-01 13:41:45
【问题描述】:

我尝试定义 replaceEltByclass(E1:list,E2:list) E 是一个没有子列表的列表。 E1 中属于 C 类的每个元素都被替换为 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).

【问题讨论】:

    标签: list replace prolog


    【解决方案1】:

    问题出在:class(C,L),not(member(E,L)), 因为如果 C=C2 会给出两种解决方案,然后例如 e1 属于 C2,因此它将用 L 替换它,而当 C=C1 时它会保留一个解决方案e1。你需要写“C是否存在这样的成员(e1,L)??”所以你必须收集所有可能的列表,看看 member(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 谓词的必要性。
    猜你喜欢
    • 2020-01-10
    • 2015-12-29
    • 2020-09-27
    • 2021-09-21
    • 1970-01-01
    • 2015-02-12
    • 2018-05-06
    • 1970-01-01
    • 2022-10-20
    相关资源
    最近更新 更多