【发布时间】:2017-04-23 19:48:43
【问题描述】:
我刚开始学习 prolog,我完全糊涂了。
考虑以下场景:我有一个包含有关某人的事实的知识库,格式为 person(Name,age)。
例子:
person(brad,20).
person(lindsey,15).
person(sophie,18).
person(charles,24).
我想创建一个规则,当年龄总和超过 40 时评估为真。此外,如果查询,它将输出/显示年龄加起来为 40 的人的姓名。所以,我尝试了这个:
addsto40(X,Y,Sum) :- person(X,A), person(Y,B), Sum is A + B, Sum > 9.
当我查询以下内容时,它返回两个人的姓名,他们的年龄加起来大于 40。(我点击 ; 来获取所有解决方案)。查询示例:
?- addsto40(X,Y,Sum).
此查询返回以下内容:
X = brad,
Y = charles,
Sum = 44 ;
X = sophie,
Y = charles,
Sum = 42 ;
X = charles,
Y = brad,
Sum = 44 ;
X = charles,
Y = sophie,
Sum = 42 ;
X = Y, Y = charles,
Sum = 48.
但是,这将输出限制为两对。我希望它没有限制,所以答案可能包括:brad、lindsey 和 sophie。
我尝试了许多不成功的解决方案。我考虑过实现 addto40/3,然后添加一个人,直到总和达到 40。但是,它并没有按照我想要的方式工作。
addsto40(X,Y,Sum) :- person(X,A), person(Y,B), Sum is A + B, Sum < 40, addper(P,Sum,Newsum).
addsto40(X,Y,Sum) :- person(X,A), person(Y,B), Sum is A + B, Sum > 40.
addper(Y,Sum,Newsum) :- person(Y,X), Newsum is Sum + X, Newsum < 40, addper(P,Newsum,someSum).
addper(Y,Sum,Newsum) :- person(Y,X), Newsum is Sum + X, Newsum > 40.
请问可以引导我走向正确的方向吗?为什么这不起作用?解决方案是否在于以某种方式实施列表?您对 prolog 初学者有什么提示或技巧吗?我感谢任何形式的帮助。谢谢?
【问题讨论】:
-
请帮帮我!
标签: prolog