Prolog实现谓词检查列表元素是否存在于固定格式嵌套列表中
问题1:实现符合需求的ass(A,P)谓词
你的原始代码问题在于maplist要求三个输入列表A、P、I长度严格相等,且对应位置的元素必须匹配succ规则,和需求中「P可以包含额外项、A中元素只要在P的任意位置存在匹配项即可」的要求不符。
可以分场景实现谓词,同时覆盖校验和生成两种调用模式:
首先定义假设项的匹配规则:
% 匹配格式正确、假设值为X的证明项 is_assumption(X, [[_], _, X, 'A', '']).
然后实现主谓词:
% 模式1:P未绑定,生成符合要求的最小证明列表 ass(A, P) :- var(P), length(A, Len), % 生成1到Len的序号列表 numlist(1, Len, Indexes), % 按序号为每个假设生成对应格式的证明项 maplist([X, Idx, Entry]>>(Entry = [[Idx], Idx, X, 'A', '']), A, Indexes, P). % 模式2:P已绑定,校验A中所有假设都存在于P中 ass(A, P) :- nonvar(P), % 遍历A中每个元素,确保都能在P中找到匹配的假设项 forall(member(X, A), (member(Entry, P), is_assumption(X, Entry))).
测试结果和你给出的示例完全一致:
- 查询
?- ass([a, b], [[[1], 1, a, 'A', ''], [[2], 2, a->b, 'A',''], [[3], 3, b, 'A', '']]).返回true - 查询
?- ass([a,b],P).返回P = [[[1], 1, a, 'A', ''], [[2], 2, b, 'A', '']]
问题2:实现指定范围的成员检查功能
你需要的检查逻辑可以直接封装为独立谓词,固定P和序号列表I,判断是否存在匹配项:
% 检查是否存在I1属于I_List,使得[[I1],I1,X,'A','']是P的成员 check_ass_in_range(X, P, I_List) :- member(I1, I_List), member([[I1], I1, X, 'A', ''], P).
调用示例:check_ass_in_range(a, [[[1],1,a,'A',''],[[3],3,b,'A','']], [1,2,3]) 会返回true。
内容的提问来源于stack exchange,提问作者Martin Kunze
相关产品推荐
相关产品推荐

