如何创建新的prolog列表

时间:2011-04-10 10:14:53

标签: prolog

我想通过提供格式

来创建新列表

例如,我有以下列表:

[ ['Test1',['US','France']],  ['Test2',['German','China','UK']]  ]

现在,我希望得到以下结果:

[['Test1','US'],['Test1','France'], ['Test2','German'], ['Test2','China']], ['Test2','UK']]

由于

:)

3 个答案:

答案 0 :(得分:2)

使用直接而简单!

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种化合物,这是一种广泛传播的“最佳做法”。切换到此特定表示有许多好处:

  • 与许多其他Prolog库谓词的互操作性
  • 更好的可读性(更简洁的术语,请参见下面的示例)
  • 提高效率

要使用您在问题中使用的表示,只需添加两个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']].

享受