Prolog算术运算问题:用=无法计算,换is触发实例化错误
Prolog逻辑谜题算术运算问题解决
问题现象
用Prolog解决逻辑谜题时,算术运算未按预期执行:
- 使用
=/2运算符时,数字不会执行相加,输出保留+表达式(如10+8) - 替换为
is/2运算符后,second/2和fourth/2规则触发instantiation_error
当前代码:
simpsons([carry(homer, _, _), carry(marge, _, _), carry(bart, _, _), carry(lisa, _, _)]). first(A) :- A = bart. second(BT, ST) :- BT = ST + 8. third(D, C, A) :- D = C ; D = A. fourth(MT, HT) :- MT = HT + 8. fifth(B) :- B = homer. answer(X) :- simpsons(X), member(carry(_,_,toot), X), member(carry(_, 10, _), X), member(carry(A, _, burp), X), member(carry(B, _, sneeze), X), member(carry(bart, BT, _), X), member(carry(C, ST, cry), X), member(carry(D, 6, _), X), member(carry(marge, MT, _), X), member(carry(homer, HT, _), X), first(A), second(BT, ST), third(D, C, A), fourth(MT, HT), fifth(B).
当前输出:
X =[carry(homer,10,sneeze),carry(marge,10+8,toot),carry(bart,6+8,burp),carry(lisa,6,cry)]
期望输出:
X = [carry(homer,10,sneeze),carry(marge,18,toot),carry(bart,14,burp),carry(lisa,6,cry)]
问题原因
=/2是项统一运算符,仅用于匹配左右两边的结构,不会计算算术表达式,因此保留ST+8这类未计算的项is/2是算术求值运算符,要求右边表达式的所有变量必须提前实例化(有确定数值),原代码中调用second/2和fourth/2时,ST和HT还未绑定数值,导致触发实例化错误
解决方案
调整规则调用顺序,确保算术运算所需变量先被实例化,再用is/2计算结果:
- 将能提前绑定变量的规则(
first/1、fifth/1、third/3)移到算术运算规则之前,让ST(对应C的数值)和HT(对应homer的数值)先获得确定值 - 将
second/2和fourth/2中的=/2替换为is/2,执行算术计算
修正后代码
simpsons([carry(homer, _, _), carry(marge, _, _), carry(bart, _, _), carry(lisa, _, _)]). first(A) :- A = bart. second(BT, ST) :- BT is ST + 8. third(D, C, A) :- D = C ; D = A. fourth(MT, HT) :- MT is HT + 8. fifth(B) :- B = homer. answer(X) :- simpsons(X), member(carry(_,_,toot), X), member(carry(_, 10, _), X), member(carry(A, _, burp), X), member(carry(B, _, sneeze), X), member(carry(bart, BT, _), X), member(carry(C, ST, cry), X), member(carry(D, 6, _), X), member(carry(marge, MT, _), X), member(carry(homer, HT, _), X), first(A), fifth(B), third(D, C, A), second(BT, ST), fourth(MT, HT).
测试结果
运行修正后的代码,输出符合预期:
X = [carry(homer,10,sneeze),carry(marge,18,toot),carry(bart,14,burp),carry(lisa,6,cry)]
内容的提问来源于stack exchange,提问作者Dylan Lee
相关产品推荐
相关产品推荐

