使用Prolog处理列表

时间:2016-01-08 15:30:30

标签: list prolog

我在Prolog中遇到了问题。

考虑一个列表,其中每个元素指的是同一列表中的位置/位置。

我想写一个程序,如果我从我结束的相同位置开始,则返回true。例如:

如果我给它find-s([3,2,0,1],0)

  • 从包含3
  • 的0索引开始
  • 然后转到包含1
  • 的3索引
  • 然后1索引找到2
  • 最后到索引2,其中包含0!

所以在这种情况下它返回

我尝试了这个,但它没有工作

position([Head1| Tail1], Var1) :-
 (   Head1 == Var1,
    Tail1 == Var1 ->
     true

 ).

1 个答案:

答案 0 :(得分:1)

这应该有效

find_s(L, S) :- nth0(S, L, I), find_s(L, I, S).
find_s(_, S, S).
find_s(L, I, S) :- nth0(I, L, J), find_s(L, J, S).

但我认为它可以很容易地循环。因此,在考虑之后,让我们使用nth0 / 4代替nth0 / 3:

?- nth0(2,[a,b,c,d],X,Y).
X = c,
Y = [a, b, d].

?- nth0(2,L,$X,$Y).
L = [a, b, c, d].

为了便于阅读,我们先介绍一下replace_nth0 / 4

replace_nth0(P, L, E, LrepE) :-
    nth0(P, L, E, L_Without_E),
    nth0(P, LrepE, -1, L_Without_E).

然后

find_s(L, S) :- nth0(S, L, I), find_s(L, I, S).
find_s(_, S, S).
find_s(L, I, S) :- I >= 0, replace_nth0(I, L, J, L_rep), find_s(L_rep, J, S).