1

我有这些事实:事实(1,'a')。事实(2,'b')。事实(3,'c')。事实(4,'d')。

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

可能吗?

4

2 回答 2

1

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

facts_lists(Ids, Atoms) :-
   findall(Id-Atom, fact(Id, Atom), Pairs),
   pairs_keys_values(Pairs, Ids, Atoms).
于 2013-06-07T15:39:45.803 回答
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']
于 2013-06-07T18:58:37.233 回答