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

如何用Prolog序言定义三元素循环重复的所有列表?

用Prolog定义按固定三元素循环重复的列表

用Prolog可以轻松定义所有由单一重复元素组成的列表,示例代码如下:

?- maplist(=(_), L).
   L = []
;  L = [_A]
;  L = [_A,_A]
;  L = [_A,_A,_A]
;  ... .

这段代码能生成所有元素重复的列表。现在需要实现一个谓词,定义始终按同一顺序重复三个元素的所有列表,满足如下查询效果:

?- triple_cycle(L).
   L = []
;  L = [_A]
;  L = [_A,_B]
;  L = [_A,_B,_C]
;  L = [_A,_B,_C,_A]
;  L = [_A,_B,_C,_A,_B]
;  L = [_A,_B,_C,_A,_B,_C]
;  L = [_A,_B,_C,_A,_B,_C,_A]
;  ... .
?- L = [a,_,_,b|_], triple_cycle(L).
   false.
?- L = [_,a,_,_,b|_], triple_cycle(L).
   false.
?- L = [_,_,a,_,_,b|_], triple_cycle(L).
   false.

要求仅使用Prolog实现。


实现代码

使用确定子句文法(DCG)可以直观描述这种循环序列的模式,代码如下:

% 匹配空列表、前1个元素、前2个元素,或完整三元素组后的循环延续
triple_cycle --> [] | [A] | [A,B] | [A,B,C], triple_cycle_cont(A,B,C).

% 定义循环延续规则:可追加单个A、A+B组合、完整A+B+C组后继续循环,或终止
triple_cycle_cont(A,B,C) --> [] 
                           | [A], triple_cycle_cont(A,B,C) 
                           | [A,B], triple_cycle_cont(A,B,C) 
                           | [A,B,C], triple_cycle_cont(A,B,C).

% 将DCG转换为可直接查询的谓词
triple_cycle(L) :- phrase(triple_cycle, L).

效果说明

  • 执行?- triple_cycle(L).时,会按预期生成所有符合三元素循环模式的列表,包括空列表、长度1-2的前缀,以及不断重复三元素组的长序列。
  • 对于破坏三元素循环顺序的列表(如示例中包含b但位置不符合循环规律的情况),谓词会返回false,确保序列严格遵循A→B→C→A→B→C...的重复模式。

内容的提问来源于stack exchange,提问作者false

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 05:59:59