编写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
测试案例验证
我们用你给出的示例来测试:
- 合法且存在三连:
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) - 存在非法元素:
threeInRow(x, [b,b,j,c,j,b,j,d,d])→ 返回false(列表中包含非法字符j,合法性检查失败)
内容的提问来源于stack exchange,提问作者JapexDoe
相关产品推荐
相关产品推荐

