Prolog中如何为多案例复用同一规则实现相同返回结果
解决Prolog谓词复用逻辑的方案
这里有两种简洁的方式实现你的需求——让parentheses2处理+和-运算符时都执行L=[1,2,3]的赋值,同时避免重复代码:
方法1:使用析取运算符合并分支
直接在单个子句中用分号;匹配+或-运算符,然后统一设置L的约束:
% 匹配+或-运算符,统一设置L的值 parentheses2([H1, Op | T], L, C) :- (Op = '+' ; Op = '-'), L = [1, 2, 3]. % 原有的*分支逻辑 parentheses2([H1, '*' | T], L, C). % 原有的/分支逻辑 parentheses2([H1, '/' | T], L, C) :- L = [1, 2, 4, 5, 6, 9].
这种方式适合运算符数量较少的场景,代码紧凑直观,能直接让两种运算符共享同一套赋值逻辑。
方法2:用辅助谓词归类运算符
如果后续可能扩展更多同类型运算符,建议写一个辅助谓词来标记属于同一类的运算符,扩展性更好:
% 辅助谓词:标记加法和减法运算符 add_sub_op('+'). add_sub_op('-'). % 匹配属于add_sub_op的运算符,设置L的值 parentheses2([H1, Op | T], L, C) :- add_sub_op(Op), L = [1, 2, 3]. % 原有的*分支逻辑 parentheses2([H1, '*' | T], L, C). % 原有的/分支逻辑 parentheses2([H1, '/' | T], L, C) :- L = [1, 2, 4, 5, 6, 9].
以后如果要添加比如++这类同逻辑的运算符,只需要给add_sub_op新增一个子句即可,不用修改主谓词结构。
测试验证
执行你给出的两个查询:
?- parentheses2([1,-,3],L,5).会返回L = [1,2,3]?- parentheses2([1,+,3],L,5).同样返回L = [1,2,3]
完全符合你要求的相同结果,且没有重复编写L=[1,2,3]的代码。
内容的提问来源于stack exchange,提问作者ogarogar
相关产品推荐
相关产品推荐

