如何在ISO Prolog中实现marquee/2关系?
ISO Prolog 实现 marquee/2 循环移位关系
序言配置
首先设置必要的Prolog标志,确保字符列表的正确解析和完整字符串输出:
:- set_prolog_flag(double_quotes, chars). % 将双引号字符串解析为字符列表 :- set_prolog_flag(max_depth, 0). % 关闭输出深度限制,显示完整字符串
核心实现
定义marquee/2关系,实现循环移位的无限重复输出,确保移位无缝衔接:
marquee(Chars, Shifted) :- length(Chars, Len), Len > 0, % 仅处理非空输入 % 生成所有循环移位结果:拆分字符串为前后缀,拼接后缀+前缀得到移位结果 findall(Shift, (append(Prefix, Suffix, Chars), append(Suffix, Prefix, Shift)), Shifts), % 无限迭代移位序列,回溯时循环输出 infinite_iterate(Shifts, Shifted). infinite_iterate(List, Elem) :- member(Elem, List), infinite_iterate(List, _).
效果测试
以输入"! "为例,查询会无缝交替输出两种移位结果:
?- marquee("! ", S). S = "! " ; S = " !" ; S = "! " ; S = " !" ; ... % 无限循环输出该序列
对于更长的字符串(如"abcd"),会依次输出"abcd"、"bcda"、"cdab"、"dabc",随后重复整个序列。
内容的提问来源于stack exchange,提问作者false
相关产品推荐
相关产品推荐

