鉴于以下 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(_,[]).
有任何想法吗?