You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 15:22:19