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

编写Prolog的threeInRow谓词:判断合法9元素列表中存在三连相同字符

实现Prolog的threeInRow谓词

针对你需求的threeInRow谓词,我们需要同时满足两个核心条件:验证列表所有元素的合法性(只能是a-d),以及检查3x3棋盘(9元素列表对应)中是否存在任意方向的三连指定字符。下面是具体的实现步骤和代码:

第一步:验证元素合法性

首先我们需要定义辅助谓词来检查单个元素是否合法,再递归验证整个列表的所有元素:

% 定义合法的元素范围:a、b、c、d
valid_element(a).
valid_element(b).
valid_element(c).
valid_element(d).

% 递归验证列表中的每个元素都合法
valid_list([]).
valid_list([Head|Tail]) :-
    valid_element(Head),
    valid_list(Tail).

第二步:检查三连获胜情况

由于输入是固定9个元素的列表,对应3x3的棋盘,我们需要枚举所有可能的三连方向(横向、纵向、两条对角线),判断是否存在三个连续的目标字符:

% 检查目标字符X是否在棋盘Board中形成三连
check_win(X, Board) :-
    % 横向三连:三行中的任意一行全为X
    (Board = [X,X,X,_,_,_,_,_,_];
     Board = [_,_,_,X,X,X,_,_,_];
     Board = [_,_,_,_,_,_,X,X,X];
    % 纵向三连:三列中的任意一列全为X
     Board = [X,_,_,X,_,_,X,_,_];
     Board = [_,X,_,_,X,_,_,X,_];
     Board = [_,_,X,_,_,X,_,_,X];
    % 对角线三连:两条对角线全为X
     Board = [X,_,_,_,X,_,_,_,X];
     Board = [_,_,X,_,X,_,X,_,_]).

第三步:组合条件完成threeInRow谓词

最后我们把合法性检查和三连检查组合起来,同时可以加上列表长度的校验(虽然题目说明输入固定9元素,但加上后代码更健壮):

% 主谓词:threeInRow(目标字符X, 9元素列表Board)
threeInRow(X, Board) :-
    length(Board, 9),          % 确保列表是9个元素(可选,根据题目要求可省略)
    valid_list(Board),         % 验证所有元素都是a-d中的合法字符
    check_win(X, Board).       % 检查是否存在三连X

测试案例验证

我们用你给出的示例来测试:

  1. 合法且存在三连:threeInRow(a, [b,b,a,b,d,a,c,d,b]) → 返回true(纵向第三列全为a);threeInRow(a, [b,d,a,c,a,b,c,d,a]) → 返回true(对角线位置2、4、8全为a)
  2. 存在非法元素:threeInRow(x, [b,b,j,c,j,b,j,d,d]) → 返回false(列表中包含非法字符j,合法性检查失败)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:03:25