反转列表
Reversing a list
我需要帮助来反转列表。
fun(a, [b, d]).
fun(b, [c]).
fun(c, []).
fun(d, [e]).
fun(e, [f]).
fun(f, [g]).
fun(g, []).
xyz(X, Y):-
fun(X, Z) -> findall([A|B], (member(A, Z), xyz(A, B)), L),
flatten(L, F), sort(F, Y); Y = [].
查询 xyz(a,X).
给了我 X = [b,c,d,e,f,g].
但是,我希望它能给我 X = [g,f,e,d,c,b]
.
我尝试过不同的尝试来反转列表,但我没有任何运气。
我已经尝试在这之后添加一个额外的谓词,但它也没有用:
xyz2(X,Y):-
xyz(X,Y),
reverse(Y,Z),
Z\=0.
感谢 CapelliC 在我的其他 post 此处找到的上述实现方法。
您可以避免一些困难的编程,并通过重新定义您的问题使您的程序更易于阅读。假设 f/2
描述了一个有向图,边从第一个参数到第二个参数中的每个元素,所以:
a ---> b
a ---> d
b ---> c
% etc
那么,您的问题是,图中的哪些节点可以从给定节点到达?您可以在 library(ugraphs)
.
的帮助下定义解决方案
从 f/2
生成所有边:
edge(From-To) :-
f(From, L),
member(To, L).
您现在可以收集边、制作图形并找出从起始节点可到达的节点:
foo(X, L) :-
findall(E, edge(E), Edges),
vertices_edges_to_ugraph([], Edges, G),
reachable(X, G, All),
once(select(X, All, R)), % remove the node you start from
reverse(R, L).
根据定义,一个节点总是从其自身可达,因此您需要从可达节点列表中选择它。
?- foo(a, X).
X = [g, f, e, d, c, b].
?- foo(e, X).
X = [g, f].
?- foo(g, X).
X = [].
我不太明白为什么元素的顺序很重要。这感觉有点像代码味。
我需要帮助来反转列表。
fun(a, [b, d]).
fun(b, [c]).
fun(c, []).
fun(d, [e]).
fun(e, [f]).
fun(f, [g]).
fun(g, []).
xyz(X, Y):-
fun(X, Z) -> findall([A|B], (member(A, Z), xyz(A, B)), L),
flatten(L, F), sort(F, Y); Y = [].
查询 xyz(a,X).
给了我 X = [b,c,d,e,f,g].
但是,我希望它能给我 X = [g,f,e,d,c,b]
.
我尝试过不同的尝试来反转列表,但我没有任何运气。
我已经尝试在这之后添加一个额外的谓词,但它也没有用:
xyz2(X,Y):-
xyz(X,Y),
reverse(Y,Z),
Z\=0.
感谢 CapelliC 在我的其他 post 此处找到的上述实现方法。
您可以避免一些困难的编程,并通过重新定义您的问题使您的程序更易于阅读。假设 f/2
描述了一个有向图,边从第一个参数到第二个参数中的每个元素,所以:
a ---> b
a ---> d
b ---> c
% etc
那么,您的问题是,图中的哪些节点可以从给定节点到达?您可以在 library(ugraphs)
.
从 f/2
生成所有边:
edge(From-To) :-
f(From, L),
member(To, L).
您现在可以收集边、制作图形并找出从起始节点可到达的节点:
foo(X, L) :-
findall(E, edge(E), Edges),
vertices_edges_to_ugraph([], Edges, G),
reachable(X, G, All),
once(select(X, All, R)), % remove the node you start from
reverse(R, L).
根据定义,一个节点总是从其自身可达,因此您需要从可达节点列表中选择它。
?- foo(a, X).
X = [g, f, e, d, c, b].
?- foo(e, X).
X = [g, f].
?- foo(g, X).
X = [].
我不太明白为什么元素的顺序很重要。这感觉有点像代码味。