列表列表 - 递归对prolog

时间:2017-01-26 17:43:19

标签: list prolog

如何将所有对放在一个列表中?

我有 -

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])).

但我错过了一些清单.. 因为它不是编译。

1 个答案:

答案 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元素的数量是无限的,因此您将耗尽全局堆栈(或一般的内存)。