我在Prolog中遇到了问题。
考虑一个列表,其中每个元素指的是同一列表中的位置/位置。
我想写一个程序,如果我从我结束的相同位置开始,则返回true。例如:
如果我给它find-s([3,2,0,1],0)
所以在这种情况下它返回
我尝试了这个,但它没有工作
position([Head1| Tail1], Var1) :-
( Head1 == Var1,
Tail1 == Var1 ->
true
).
答案 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).