根据事实创建两个列表

时间:2013-06-07 15:28:11

标签: prolog

我有这些事实: 事实(1,'一个&#39)。 事实(2,' B&#39)。 事实上(3,' C&#39)。 事实(4,' d&#39)。

我的目标是创建2个列表:一个用于ID,另一个用于字符串。 所以,像这样的东西: 事实上([' a',' b',' c',' d'],[1,2,3,4]) 。 但是通过一个规则。

有可能吗?

2 个答案:

答案 0 :(得分:1)

我所知道的最简单的方法是使用库(pairs):

facts_lists(Ids, Atoms) :-
   findall(Id-Atom, fact(Id, Atom), Pairs),
   pairs_keys_values(Pairs, Ids, Atoms).

答案 1 :(得分:0)

如果您没有可用的pairs库(例如,您正在使用gprolog),这是一个稍微复杂的解决方案:

unzip( [], [], [] ).
unzip( [[L,R]|ListT], [L|LT], [R|RT] ) :-
    unzip( ListT, LT, RT ).

fact_lists( Ids, Atoms ) :-
    findall( [Id, Atom], fact(Id, Atom), FactList ),
    unzip( FactList, Ids, Atoms ).

所以你打电话:

fact_lists( Ids, Atoms ).

得到:

Ids = [1,2,3,4]
Atoms = ['a','b','c','d']