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

如何编写Prolog函数遍历列表的列表并对每个子列表应用规则

编写Prolog函数处理三元组列表

需求:实现一个Prolog函数,遍历由triplets/2生成的三元组列表(例如[[o,o,x],[o,x,x],[x,x,o],[x,o,x],[o,x,o],[x,o,o]]),逐个取出每个子三元组,将其元素传入apply_rule/4处理,最终把所有处理结果收集到一个结果列表中。

现有可用代码

% Color definition
color(o).
color(x).

% Rule definition
rule(o,o,o,_,o). % Null rule
rule(x,o,o,r(A,_,_,_,_,_,_),A) :- color(A).
rule(o,x,o,r(_,B,_,_,_,_,_),B) :- color(B).
rule(o,o,x,r(_,_,C,_,_,_,_),C) :- color(C).
rule(x,o,x,r(_,_,_,D,_,_,_),D) :- color(D).
rule(x,x,o,r(_,_,_,_,E,_,_),E) :- color(E).
rule(o,x,x,r(_,_,_,_,_,F,_),F) :- color(F).
rule(x,x,x,r(_,_,_,_,_,_,G),G) :- color(G).

%Creates a list of lists of triplets form a list given
triplets(List, Triplets) :-
    triplets_helper([o|List], Triplets).          % insert null at beginning   

triplets_helper([X1,X2], [[X1,X2,o]]) :- !.       % insert null at the end
triplets_helper([X1,X2,X3|Xs], [[X1,X2,X3]|Ys]) :-
    triplets_helper([X2,X3|Xs], Ys).

%Applies the rules to each triplet    
apply_rule(X,Y,Z,Re) :- 
 R=r(x,o,x,x,x,x,o), rule(X,Y,Z,R,Sol),
 Re = Sol.

实现处理函数

编写process_triplets/2函数,通过递归遍历三元组列表,逐一处理每个子三元组并收集结果:

% 处理空的三元组列表,返回空结果
process_triplets([], []).

% 递归处理每个三元组:取出第一个三元组[X,Y,Z],调用apply_rule得到结果Res,
% 再处理剩余的三元组列表RestTriplets,得到RestRes,最终结果是[Res|RestRes]
process_triplets([[X,Y,Z]|RestTriplets], [Res|RestRes]) :-
    apply_rule(X,Y,Z,Res),
    process_triplets(RestTriplets, RestRes).

使用示例

以输入列表[o,x,x,o,x,o]为例:

  1. 调用triplets([o,x,x,o,x,o], Triplets)会生成三元组列表:
    [[o,o,x],[o,x,x],[x,x,o],[x,o,x],[o,x,o],[x,o,o]]
    
  2. 调用process_triplets(Triplets, Result)即可得到所有三元组的处理结果列表。

可直接执行查询:

?- triplets([o,x,x,o,x,o], T), process_triplets(T, R).

内容的提问来源于stack exchange,提问作者Lucas Rus Gallego

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 23:02:22