Prolog:递归获取所有列表元素

时间:2017-10-22 13:20:22

标签: list recursion prolog

这里我有一个模块列表规则。

module(oop). % Object Oriented Programming
module(se1). % Software Engineering 1
module(se2). % Software Engineering 2
% etc.

然后我定义了每个模块的先决条件。

require(oop, []). % oop is base module. It doesn't require any other modules.
require(se1, [oop]). % se1 requires oop
require(se2, [se1]). % se2 requires se1

如您所见,se2需要se1(直接)和oop(间接)。 我想定义一个递归遍历列表的函数,并将所有必需的模块作为列表返回。

查询:

?- dependent(se2, L).

预期结果:

L = [se1, oop]

如何使用递归在Prolog中编写从属谓词?

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:1)

使用相互递归的一种简单明了的方法:

dependent(X,L):- module(X), require(X,L1), find(L1,L).

find([],[]).
find([H|T],L):-dependent(H,L2),find(T,L3),append([H|L2],L3,L).

示例:

?- dependent(se2,L).
L = [se1, oop].

?- dependent(se1,L).
L = [oop].

?- dependent(oop,L).
L = [].