我有这些事实:事实(1,'a')。事实(2,'b')。事实(3,'c')。事实(4,'d')。
我的目标是创建 2 个列表:一个用于 ID,一个用于字符串。所以,像这样的东西:fact(['a', 'b', 'c' , 'd'], [1, 2, 3, 4])。但根据规则。
可能吗?
我有这些事实:事实(1,'a')。事实(2,'b')。事实(3,'c')。事实(4,'d')。
我的目标是创建 2 个列表:一个用于 ID,一个用于字符串。所以,像这样的东西:fact(['a', 'b', 'c' , 'd'], [1, 2, 3, 4])。但根据规则。
可能吗?
我知道的最简单的方法是使用库(对):
facts_lists(Ids, Atoms) :-
findall(Id-Atom, fact(Id, Atom), Pairs),
pairs_keys_values(Pairs, Ids, Atoms).
如果您没有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']