List 分裂原子和保持分离器

List 分裂原子和保持分离器,list,split,prolog,List,Split,Prolog,假设我有一个包含一些keyN分隔符的原子,我如何生成一个包含独立元素列表的列表 1000在注释中引用的基础上,使用(我认为)在SICStus中可用的内置谓词: split_atom_list(Atom, Keys, [Res, Key|Res_List]) :- aggregate(min(P,(Q,K)), S^( member(K, Keys), sub_atom(Atom, P,Q,S, K)), min(X,(N,Key))), sub_a

假设我有一个包含一些keyN分隔符的原子,我如何生成一个包含独立元素列表的列表

1000在注释中引用的基础上,使用(我认为)在SICStus中可用的内置谓词:

split_atom_list(Atom, Keys, [Res, Key|Res_List]) :-
    aggregate(min(P,(Q,K)), S^(
        member(K, Keys),
        sub_atom(Atom, P,Q,S, K)), min(X,(N,Key))),
    sub_atom(Atom, 0,X,_, Res),
    Z is X+N,
    sub_atom(Atom, Z,_,0, Rest),
    !, split_atom_list(Rest, Keys, Res_List).
split_atom_list(_Atom, _Keys, []).
聚合将查找第一个(最左侧)匹配键。您可以更改基本情况以接受任何未分析的尾部:

split_atom_list(Atom, _Keys, [Atom]).

因此,它获取一个键列表,抛出原始原子中没有的任何键/元素对,将所有元素/键对作为单独的列表元素给出,最后一个除外。最后一个它抛出的只是钥匙,保留最后一个元素?您还将在引号中显示'elemN',这与不带引号的情况相同。这有什么意义吗?不管有没有,在这种情况下,它们都是一样的。也许另一个例子会有所帮助,只是为了确保模式清晰。你的例子的结果列表不应该是,
Res_list=[elem1,key1,elem2,key2,…elemN,keyN]?或者您是故意丢弃最后一个元素的键?@lower最后一个元素可能是key@lurker到目前为止,我更改了谓词原子_concat_列表来维护一个键,然后递归地使用其他键完成,但情况并非如此。非常感谢,但我在尝试此查询时遇到了一个问题<代码>拆分原子列表('id0 REF id1 FER id2 REF**id3 FER id4**',['REF'],Res)。Res=[id0,'REF','id1 FER id2','REF']?
我在这个查询中遇到了其他错误,
?-split_atom_list('id0有什么错误?可能是语法不明确?可能还应该有'I颠倒分隔符的顺序,我得到了这个结果;
|?-split_atom_list('id0aggregate(参见示例)找到了最小键位置(P)',另存为键长(Q)和键本身。^用于释放与端点的距离
split_atom_list(Atom, _Keys, [Atom]).