PROLOG 中的递归?
Recursion in PROLOG?
鉴于以下 Prolog 事实:
f(a, [b]).
f(b, [c]).
f(c, [d]).
f(d, [e]).
f(e, []).
我需要创建一个查询 xyz(a,Y)
以便我得到 Y = [e,d,c,b]
,因为 a 依赖于 b,而 b 又依赖于 c,等等。
我当前的查询是:
xyz(X,Y):-
f(X,P),
member(Y,[P]).
但是,这个查询 xyz(a,Y)
只给我 Y = [b]
,而不是 b 的家属等
我想也许我可以将这两行添加到上面查询的末尾,但这并不像我希望的那样有效。由于前面的自由查询成功地检索了 a 的依赖 b,我希望接下来的两行可能对 b 和其他做同样的事情。但是,我认为这可能不是处理它的好方法。也许递归是个更好的主意。
f(P,S),
member(Y,[P]).
我很确定我应该在最后添加一个递归,但我不确定如何处理。有人可以帮我吗?
(3/4) 编辑:
我能够使用下面的@CapelliC 方法成功解决单元素列表的问题。但是,我想扩展这个问题,以便它适用于多元素列表,其中 Prolog 事实现在看起来像:
f(a, [b, d]).
f(b, [c]).
f(c, []).
f(d, [e]).
f(e, [f]).
f(f, [g).
f(g, []).
在这种情况下,xyz(a,X)
的查询应该给我:X = [b,c,d,e,f,g]
,元素顺序不一定重要,我可以在之后排序。
这是之前适用于单个列表的代码:
xyz(Z, [X|Y]):-
f(Z,[X]),
!,
xyz(X,Y).
xyz(_,[]).
根据@lurker 的说法,我需要合并成员函数,但我遇到了麻烦。这是我目前的方法,但它不起作用,只是给我一个空列表作为所有内容的输出:
xyz(Z, [X|Y]):-
f(Z,X),
member(Y,X), // I'm not sure if this should be a 'Y'
!,
xyz(X,Y).
xyz(_,[]).
有什么想法吗?
此代码段以相反的顺序获取列表,根据您的要求...
xyz(K, [D|Ds]) :- f(K, [D]), !, xyz(D, Ds).
xyz(_, []).
edit 扩展到多个依赖元素(但没有循环!)可以像
xyz(K, Ds) :- f(K, DKs) -> findall([T|P], (member(T, DKs), xyz(T, P)), L), flatten(L, F), sort(F, Ds) ; Ds = [].
鉴于以下 Prolog 事实:
f(a, [b]).
f(b, [c]).
f(c, [d]).
f(d, [e]).
f(e, []).
我需要创建一个查询 xyz(a,Y)
以便我得到 Y = [e,d,c,b]
,因为 a 依赖于 b,而 b 又依赖于 c,等等。
我当前的查询是:
xyz(X,Y):-
f(X,P),
member(Y,[P]).
但是,这个查询 xyz(a,Y)
只给我 Y = [b]
,而不是 b 的家属等
我想也许我可以将这两行添加到上面查询的末尾,但这并不像我希望的那样有效。由于前面的自由查询成功地检索了 a 的依赖 b,我希望接下来的两行可能对 b 和其他做同样的事情。但是,我认为这可能不是处理它的好方法。也许递归是个更好的主意。
f(P,S),
member(Y,[P]).
我很确定我应该在最后添加一个递归,但我不确定如何处理。有人可以帮我吗?
(3/4) 编辑:
我能够使用下面的@CapelliC 方法成功解决单元素列表的问题。但是,我想扩展这个问题,以便它适用于多元素列表,其中 Prolog 事实现在看起来像:
f(a, [b, d]).
f(b, [c]).
f(c, []).
f(d, [e]).
f(e, [f]).
f(f, [g).
f(g, []).
在这种情况下,xyz(a,X)
的查询应该给我:X = [b,c,d,e,f,g]
,元素顺序不一定重要,我可以在之后排序。
这是之前适用于单个列表的代码:
xyz(Z, [X|Y]):-
f(Z,[X]),
!,
xyz(X,Y).
xyz(_,[]).
根据@lurker 的说法,我需要合并成员函数,但我遇到了麻烦。这是我目前的方法,但它不起作用,只是给我一个空列表作为所有内容的输出:
xyz(Z, [X|Y]):-
f(Z,X),
member(Y,X), // I'm not sure if this should be a 'Y'
!,
xyz(X,Y).
xyz(_,[]).
有什么想法吗?
此代码段以相反的顺序获取列表,根据您的要求...
xyz(K, [D|Ds]) :- f(K, [D]), !, xyz(D, Ds).
xyz(_, []).
edit 扩展到多个依赖元素(但没有循环!)可以像
xyz(K, Ds) :- f(K, DKs) -> findall([T|P], (member(T, DKs), xyz(T, P)), L), flatten(L, F), sort(F, Ds) ; Ds = [].