我有这些事实: 事实(1,'一个&#39)。 事实(2,' B&#39)。 事实上(3,' C&#39)。 事实(4,' d&#39)。
我的目标是创建2个列表:一个用于ID,另一个用于字符串。 所以,像这样的东西: 事实上([' a',' b',' c',' d'],[1,2,3,4]) 。 但是通过一个规则。
有可能吗?
答案 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']