【发布时间】:2016-03-25 14:38:43
【问题描述】:
我有一个规则
% X is descendant of Y
descendant(X,Y) :-
我正在尝试编写一个规则来找出哪个节点没有后代。我如何告诉 prolog 我想找到每个失败的 X descendant(X,_)。
我试过了,结果不正确。
nodescendants(X) :- \+(descendant(X, _)).
编辑以更新我的问题。实际上我发现的更严格。
鉴于以下事实和规则。
cyborg(greatgrandparent).
cyborg(grandparent).
female(parent).
male(child).
cyborg(child2).
female(jr_child).
parent(greatgrandparent, grandparent).
parent(grandparent, parent).
parent(parent, child).
parent(parent, child2).
parent(child, jr_child).
% X is descendant of Y
descendant(X,Y) :-
% C is cyborg descendant of Y
cyborg_descendant(C,Y) :-
is_human_or_cyborg(X) :-
human(X)
; cyborg(X).
has_no_cyborg_descendants(X) :-
is_human_or_cyborg(X),
\+(cyborg_descendant(_, X)).
当我跑去寻找所有没有电子人后代的人(电子人+所有人类)时,“祖父母”被标记为真,这不应该是这种情况。作为祖父母 -> 父母 -> child2 这是一个机器人。
?- has_no_cyborg_descendants(X).
X = child ;
X = jr_child ;
X = grandparent ;
X = child2.
【问题讨论】:
-
这个问题的解决方案实际上是在你非常相似的问题的答案中提供的,Select list out of a list?。为了生成非后代,您需要一种方法来确定
X是否是有效的后代(存在于“所有可能后代的宇宙”中)。 -
@lurker 更新了我的问题
-
cyborg_desccendant(child2, grandparent)失败,因为在您的定义中grandparent必须是child2的父级(它不是),或者child2必须有一个父级是 @ 的 cyborg 后代987654332@,它没有。所以grandparent,根据你的cyborg_descendant逻辑,没有半机械人后代(cyborg_descendant(_, grandparent)失败)。 -
顺便说一句,您需要将相似的事实组合在一起。所以将
cyborg/1事实和female/1事实放在一起。如果它们不连续,并非所有 Prolog 解释器都会看到您的所有事实。您可能会看到警告,例如 warning: discontiguous predicate cyborg/1 - 从句被忽略(来自 GNU Prolog)。 -
@lurker 好吧。我将不得不仔细考虑这一点,以确保它是错误的,只要沿着链条向下的任何后代都是机器人
标签: prolog