【问题标题】:Split atom and conserve separators拆分原子并保存分隔符
【发布时间】:2016-03-06 09:36:12
【问题描述】:

假设我有一个包含一些 keyN-separators 的原子,我如何生成一个包含单独元素列表的列表

1000

示例:

  ?- Atom ='elem1key1elem2key2elem3key1...elemN,keyN',
     split_atom_list(Atom,[key1,key2,keyN],Res_List).

Res_List = [elem1,key1,elem2,key2,...elemN,keyN];
yes

【问题讨论】:

  • 所以它需要一个键列表,抛出任何不在原始原子中的键/元素对,将所有元素/键对作为单独的列表元素,除了最后一个。最后一个它只扔出钥匙并保留最后一个元素?您还在引号中显示“elemN”,这与没有引号的情况相同。这有什么意义吗?无论有没有,在这种情况下,它们都是一样的。也许另一个例子会有所帮助,只是为了确保模式清晰。
  • 你的例子的结果列表不应该是Res_List = [elem1,key1,elem2,key2,...elemN,keyN];吗?还是您有意删除最后一个元素的键?
  • @lurker 最后一个元素可能是键
  • @lurker 到目前为止,我更改谓词 atomic_concat_list @CapelliC 以维护单个键,然后递归地使用其他键完成,但事实并非如此

标签: list split prolog


【解决方案1】:

基于 cmets 中提到的 the answer,使用(我认为)在 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]).

【讨论】:

  • 非常感谢,但我在尝试此查询时遇到了问题; split_atom_list('id0 REF id1 FER id2 REF** id3 FER id4**',[' REF '],Res). Res = [id0,' REF ','id1 FER id2',' REF '] ?
  • 我在这个查询中遇到了其他错误,?-split_atom_list('id0<<:id1<id5<<id2<:id6<<:id3<id5:id4',['<<:','<<','<:',':'],Res). Res = [id0,<<:,'id1<id5',<<,id2,<:,id6,<<:,'id3<id5',:] ?
  • 有什么错误?也许“语法”是模棱两可的?也许分隔符之间也应该有'
  • 我颠倒了分隔符的顺序,我得到了这个结果; | ?- split_atom_list('id0<<:id1<id5<<id2<:id6<<:id3<id5:id4',[:,<,<<,'<<:'],Res). Res = [id0,<,'',<,'',:,id1,<,id5,<,'',<,id2,<,'',:,id6,<,'',<,'',:,id3,<,id5,:] ? ;
  • 聚合(参见 here 示例)找到最小键位置 (P),保存为键长度 (Q) 以及键 (K) 本身。需要 ^ 来释放与末端 (S) 的距离
猜你喜欢
  • 1970-01-01
  • 2016-11-26
  • 2022-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-24
相关资源
最近更新 更多