如何将所有对放在一个列表中?
我有 -
pair([H|T], [H,E]) :- member(E, T).
pair([_|T], P) :- pair(T, P).
我希望答案是对的列表。
所以我试试 -
listPairs([],[Res1]):-
Res1=[].
listPairs(L,[Res2]):-
L=[H|T],
append(pair([H|T],[Res2]),listPairs(T,[Res2])).
但我错过了一些清单.. 因为它不是编译。
答案 0 :(得分:3)
我真的不明白你对append/2
的目的是什么。绝对不能在append/3
中设置应该调用的目标,因为在这种情况下,它们将被视为仿函数。
然而,您可以轻松使用几乎所有Prolog系统中实现的findall/3
谓词(至少我所见过的所有Prolog系统都是如此):
listPairs(L,Pairs) :-
findall(Pair,pair(L,Pair),Pairs).
findall/3
的工作原理如下:
findall(Format,Goal,List).
在此处指定Goal
(此处为pair(L,Pair)
),Prolog将调用Goal
。每次Goal
成功,Prolog都会暂停解释器并将格式为Format
的en元素添加到List
。当Goal
失败时,将返回所有Format
的列表。
如果我运行查询,我会得到:
?- listPairs([1,a,2,'5'],Pairs).
Pairs = [[1, a], [1, 2], [1, '5'], [a, 2], [a, '5'], [2, '5']].
请注意L
必须接地(作为列表,意思是没有未实例化的尾部,未实例化的元素就可以了),因为否则您将生成的pair/2
元素的数量是无限的,因此您将耗尽全局堆栈(或一般的内存)。