我刚开始学习有关序言,我彻底困惑。初学者序言:与谓词逻辑和(也许)语法的问题
请考虑以下情形:我有一个知识库,其中包含关于一个人的事实,格式为人(姓名,年龄)。
例子:
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).
该查询返回follwing:
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.
但是,这将输出限制为对2。我希望它没有限制,答案可能包括:brad,lindsey和sophie。
我尝试了一些不成功的解决方案。我考虑过实施addsto40/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初学者有任何提示或技巧吗?我很感激任何帮助。谢谢?
请帮帮我! –