Prolog列表翻译器代码返回False问题排查求助
问题分析与修正
你的代码存在几处语法错误,导致直接返回false,以下是具体问题和修正方案:
1. 语法错误修正
(1)contain谓词的错误
原代码中存在参数缺失和逻辑错误:
contain(,[]). % 第一个参数缺失,且空列表不可能包含元素,该子句无意义 contain(X,[X|]). % 列表尾参数缺失
正确的成员检查谓词只需匹配元素存在的情况:
contain(X, [X|_]). % X是列表的第一个元素 contain(X, [_|L]) :- contain(X, L). % 递归检查剩余列表
(2)contain_2谓词的错误
原代码中列表结构参数不完整:
contain_2(X, [(X, Y) | ], Y). % 列表尾参数缺失 contain_2(X, [|T], Y) :- contain_2(X, T, Y). % 列表头元素缺失
修正后保证匹配词典的键值对结构:
contain_2(X, [(X, Y)|_], Y). % 匹配以(X,Y)开头的词典条目 contain_2(X, [_|T], Y) :- contain_2(X, T, Y). % 递归查找剩余词典条目
2. 逻辑验证
修正后的tr谓词可以正确遍历输入列表中的每个元素,从词典中找出对应的翻译值。setof/3会自动收集所有符合条件的结果,去重并排序,正好符合你期望的输出。
完整修正代码
contain(X, [X|_]). contain(X, [_|L]) :- contain(X, L). contain_2(X, [(X, Y)|_], Y). contain_2(X, [_|T], Y) :- contain_2(X, T, Y). tr(XS, L, Y) :- contain(Z, XS), contain_2(Z, L, Y). translate(M, N, R) :- setof(Y, tr(M, N, Y), R).
测试你的示例输入:
translate([m,n], [(m,c), (m,d), (n,e), (c,f)], X).
会返回X = [c, d, e],符合预期。
内容的提问来源于stack exchange,提问作者confusedStudent
相关产品推荐
相关产品推荐

