好吧,我做到了。
main_task(Xs, Ys, Zs) :-
atom_chars(Xs, Xl),
atom_chars(Ys, Yl),
retractall(record(_, _)),
assert(record(0, [])),
process(Xl, Yl, Zl),
atom_chars(Zs, Zl).
process(Xl, Yl, _) :-
get_sublist(Xl, Zl),
length(Zl, L),
record(MaxL, _),
L > MaxL,
get_index(Yl, Zl, Il),
test_even(Il),
test_intersect(Il, L),
retractall(record(_, _)),
assert(record(L, Zl)),
fail.
process(_, _, Zl) :-
record(_, Zl).
get_sublist(L1, L2) :-
get_tail(L1, L3),
get_head(L3, L2).
get_tail(L, L).
get_tail([_|T], L) :-
get_tail(T, L).
get_head([H|T1], [H|T2]) :-
get_head(T1, T2).
get_head(_, []).
get_index(Yl, Zl, Il) :-
get_index(Yl, Zl, Il, 0).
get_index([], _, [], _).
get_index([Yh|Yt], Zl, [I|It], I) :-
get_head([Yh|Yt], Zl),
!,
I1 is I + 1,
get_index(Yt, Zl, It, I1).
get_index([_|Yt], Zl, Il, I) :-
I1 is I + 1,
get_index(Yt, Zl, Il, I1).
test_even(Il) :-
length(Il, L),
L > 0,
L mod 2 =:= 0.
test_intersect([_], _).
test_intersect([X,Y|T], L) :-
Y - X >= L,
test_intersect([Y|T], L).
- 列表中关于使用列表的符号处的所有行
- 初始化动态数据库——将存储在其中,以及它的最大行长
- 枚举来自 X 的所有子字符串(子列表)。 Bust 进行双重“修剪” - 首先在前面切断的列表中,然后从后面。
- 检查结果字符串的长度,如果我们已经有很长的,请立即离开以继续破坏
- 我们考虑一个 Y 出现的索引列表,然后列表的每个元素 - Y 中的一个位置,它包括 Z。
- 检查奇偶校验 - 只需考虑索引列表的长度,chёtnaya 长度 - 偶数个条目。我们需要检查它是否大于零。
- 检查交点 - 你需要检查索引列表中两个相邻元素之间的差异,差异应该始终大于长度 Z。
- 如果进行了所有检查,则存在动态数据库更新 - 当前列表 Z 存储为最大值
- 最后它是一个强制失败,它被回滚到第 3 段中的 fork 并继续搜索。注意:如果不进行任何检查,则本次测试失败立即回滚到第 3) 段中的分叉并继续搜索。
- 当萧条结束时,执行第二个规则谓词过程,它只是选择基数中的最后一个 spicok Z。
- 在列表的末尾 Z 被转换回字符串