倒车列表(Reversing a list)

2019-10-22 04:27发布

我需要帮助扭转了名单。

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为方针,以上述我的其他职位发现这里的落实。 递归在Prolog?

Answer 1:

你能避免一些困难的编程,让你的程序更易于通过重新定义你的问题,阅读。 说的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 = [].

我完全不明白为什么元素的顺序是显著。 这感觉有点像一个代码味道。



文章来源: Reversing a list
标签: graph prolog