如何在Prolog中查询事实的总和?新手技术求助
解决Prolog中计算两种食物总卡路里的问题
嘿,作为Prolog新手碰到这种逻辑和算术结合的问题真的很常见!我来一步步帮你搞定~
首先得明白:Prolog的查询逻辑和咱们平时写数学表达式不一样,它是先匹配事实获取值,再进行算术计算,不能直接把谓词当成数值来加。你之前的写法报错,就是因为没遵循这个逻辑。
直接查询的正确写法
你需要先分别获取两种食物的卡路里值,用不同变量存储,再用is/2谓词计算总和(is是Prolog里用来计算算术表达式并把结果绑定到变量的关键):
calories(pizzaSlice, X), calories(porkFillet, Y), Z is X + Y.
执行这个查询时,Prolog会:
- 先匹配
calories(pizzaSlice, X),得到X = 250 - 接着匹配
calories(porkFillet, Y),得到Y = 400 - 最后用
Z is X + Y计算总和,得到Z = 650
运行后你就能看到结果Z = 650啦。
封装成可复用的谓词(进阶)
如果以后经常需要计算两种食物的总卡路里,可以把这个逻辑封装成一个自定义谓词,比如total_calories/3:
total_calories(Food1, Food2, Total) :- calories(Food1, C1), % 获取第一种食物的卡路里 calories(Food2, C2), % 获取第二种食物的卡路里 Total is C1 + C2. % 计算总和
之后查询就更简洁了:
total_calories(pizzaSlice, porkFillet, T).
同样会得到T = 650的结果。
为什么你之前的写法不对?
- 你尝试的
(calories(pizzaSlice, X) + calories(porkFillet, X)):calories是谓词,不是数值,不能直接用+运算;而且同一个变量X不能同时绑定250和400,会产生冲突。 - 哪怕用了不同变量
X和Y,没加is的话,Prolog只会把X + Y当成一个未求值的表达式,不会计算出具体数值。
内容的提问来源于stack exchange,提问作者Saul Martinez




