我是 Prolog 世界的新手。我想知道一个排列是否是“一个周期”。
我正在尝试编写一个谓词来从排列中生成循环。这是我的代码(不工作):
find_next([E|_], [N|_], E, N).
find_next([_|L1], [_|L2], E, N) :-
find_next(L1, L2, E, N).
find_cycle(L1, L2, E, C) :-
append(C, [E], C1),
find_next(L1, L2, E, N),
find_cycle(L1, L2, N, C1).
排列由两个列表表示(例如:[1, 2, 3, 4], [3, 4, 2, 1])。
find_next
为元素 (E) 生成下一个循环元素 (N)(例如:E=1,N=3)。
find_cycle
从元素 E 开始寻找循环 (C)。
不幸的是,当 find_next 返回与循环 C 的第一个元素相同的 N 时,我不知道如何停止重复。
编辑:一些例子。
find_cycle([1, 2, 3, 4], [3, 4, 2, 1], 1, X).
应该返回:
X = [1, 3, 2, 4];
false.
和:
find_cycle([1, 2, 3, 4], [4, 2, 1, 3], 1, X).
应该返回:
X = [1, 4, 3];
false.
为什么?它是将排列简单地分解为不相交的循环。让我们分析第二个排列:[1, 2, 3, 4], [4, 2, 1, 3]
。
Take first element: 1.
1 goes into 4
4 goes into 3
3 goes into 1
end of cycle.
这种排列不能分解成一个循环(生成循环的长度小于排列的长度)。