【问题标题】:Beginner Prolog: Issues with Predicate Logic and (maybe) syntax初学者序言:谓词逻辑和(可能)语法的问题
【发布时间】: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


【解决方案1】:

您可能应该使用列表,因为您正在尝试获取年龄总和大于 40 的人的列表。

以下是与您的方法类似的方法,但使用列表代替。

addsto40([H|_],Sum,NewSum) :- person(H,A), NewSum is A + Sum, NewSum > 40.
addsto40([H|T],Sum,EndSum) :- person(H,A), NewSum is A + Sum, addsto40(T,NewSum,EndSum).

然后您的查询将是:

addsto40(X,0,Sum).

但是,您会注意到上述内容将多次包含同一个人,并且您的列表中可能包含无限数量的人。为了解决这个问题,我们添加了一个谓词来检查列表是否包含特定成员(称为“包含”)并使用它来确保我们不会将同一个人两次添加到我们的解决方案中。我还将使用辅助谓词分解出起始总和(0)和起始列表(空)。最终代码如下所示。

addsto40(X,Sum) :- addsto40help(X,0,[],Sum).

addsto40help([H|_],Sum,Used,NewSum) :- person(H,A), not(contains(H,Used)), NewSum is A + Sum, NewSum > 40.
addsto40help([H|T],Sum,Used,EndSum) :- person(H,A), not(contains(H,Used)), NewSum is A + Sum, addsto40help(T,NewSum,[H|Used],EndSum).

contains(X,[X|_]).
contains(X,[_|T]) :- contains(X,T).

您的查询将是:

addsto40(X,Sum).

【讨论】:

  • 非常感谢,这很有道理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多