如何在GNU Prolog中将用户输入转换为可复用谓词并访问p、r、q变量
Prolog逻辑表达式变量访问与求值实现解答
完全可以实现,这是Prolog领域自定义逻辑运算求值的典型可行需求,你可以通过新增配套子句完成变量访问、真值赋值、结果计算的全流程,具体实现方案如下:
实现思路
你只需要在现有functionClause的基础上,新增两类子句即可:
- 变量真值绑定子句:用来存储/获取p、r、q对应的真值,支持静态写死或者动态传入两种模式
- 表达式递归求值子句:拆解
or(and(r,q), not(p))这类嵌套的逻辑表达式结构,逐层计算结果,遇到原子变量时调用真值绑定子句取值
完整示例代码
% ========== 1. 变量真值绑定事实(静态赋值用,可修改) ========== truth_value(p, false). truth_value(q, true). truth_value(r, true). % ========== 2. 逻辑表达式递归求值子句 ========== % 原子变量取值 eval(Var, Res) :- atom(Var), truth_value(Var, Res). % 非运算求值 eval(not(Expr), Res) :- eval(Expr, SubRes), (SubRes = true -> Res = false ; Res = true). % 与运算求值 eval(and(ExprA, ExprB), Res) :- eval(ExprA, ResA), eval(ExprB, ResB), (ResA = true, ResB = true -> Res = true ; Res = false). % 或运算求值 eval(or(ExprA, ExprB), Res) :- eval(ExprA, ResA), eval(ExprB, ResB), (ResA = true ; ResB = true) -> Res = true ; Res = false. % ========== 3. 补充原有functionClause子句的功能 ========== functionClause(Function, CalcResult) :- eval(Function, CalcResult).
调用效果
你输入的查询可以改写为:?- functionClause(or(and(r,q), not(p)), Result).
按照上面示例的真值赋值(p假、q真、r真),运算结果为Result = true。
如果需要自动穷举所有p、q、r的真值组合计算结果,只需要把真值绑定事实修改为多备选值即可:
truth_value(p, true). truth_value(p, false). truth_value(q, true). truth_value(q, false). truth_value(r, true). truth_value(r, false).
调用查询时Prolog会自动返回8组真值组合对应的所有运算结果。
内容的提问来源于stack exchange,提问作者JJ Kam
相关产品推荐
相关产品推荐

