我想通过提供格式
来创建新列表例如,我有以下列表:
[ ['Test1',['US','France']], ['Test2',['German','China','UK']] ]
现在,我希望得到以下结果:
[['Test1','US'],['Test1','France'], ['Test2','German'], ['Test2','China']], ['Test2','UK']]
由于
:)
答案 0 :(得分:2)
使用dcg直接而简单!
to_pairs([]) --> []. to_pairs([X-Ys|XYs]) --> to_pairs_with_key(Ys, X), to_pairs(XYs). to_pairs_with_key([] , _) --> []. to_pairs_with_key([V|Vs], K) --> [K-V], to_pairs_with_key(Vs, K).
示例查询:
?- phrase(to_pairs([test1-[usa,france],test2-[germany,china,uk]]), KVs). KVs = [test1-usa,test1-france,test2-germany,test2-china,test2-uk].
请注意,我们将对代表为skView.frameInterval = 4
种化合物,这是一种广泛传播的“最佳做法”。切换到此特定表示有许多好处:
要使用您在问题中使用的表示,只需添加两个maplist/3
目标:
?- use_module(library(lambda)). true. ?- Xss0 = [[test1,[usa,france]], [test2,[germany,china,uk]]], maplist(\[K,Vs]^(K-Vs)^true,Xss0,Xss1), phrase(to_pairs(Xss1),Ys0), maplist(\ (K-V)^[K,V]^true,Ys0,Ys1). Xss0 = [[test1,[usa,france]],[test2,[germany,china,uk]]], Xss1 = [ test1-[usa,france] , test2-[germany,china,uk] ], Ys0 = [ test1-usa , test1-france , test2-germany , test2-china , test2-uk ], Ys1 = [[test1,usa],[test1,france],[test2,germany],[test2,china],[test2,uk]].
答案 1 :(得分:0)
Prolog对我很安静,但我认为你应该这样做:
First([Key,[Head, Tail]], Res):-
Res将是你的最终名单。如果res为空,则您必须创建Res = [ Key, Head ]
并使用First
[Key, [Tail], Res]
你看到了这个主意吗?
答案 2 :(得分:0)
非递归变体:
heads( List, NewList ) :-
findall( [Name1, Name2],
(
member( [Name1, Y], List),
member( Name2, Y)
),
NewList).
所以我们有:
?- heads([['Test1',['US','France']],['Test2',['German','China']]], X).
X = [['Test1', 'US'], ['Test1', 'France'], ['Test2', 'German'], ['Test2', 'China']].
或者,我们可以制作一些递归谓词(它仅适用于包含2个国家/地区名称的列表(例如['US','France'])):
pooq( [], [] ).
pooq( [[Name1, [Govno, Blevota]] | Tail], List ) :-
append( [[Name1, Govno],[Name1,Blevota]], ListNew, List ),
pooq( Tail, ListNew ).
并且像那样说:
?- pooq([['Test1',['US','France']],['Test2',['German','China']]], X).
X = [['Test1', 'US'], ['Test1', 'France'], ['Test2', 'German'], ['Test2', 'China']].
享受