【问题标题】:Prolog - Chain rule for Step SiblingsProlog - Step Siblings 的链式规则
【发布时间】:2014-07-25 05:03:42
【问题描述】:

我是 Prolog 的新手,并且有一个关于为共享“共同父母”的兄弟姐妹编写“链式规则”的问题。

在我的程序中,我假设存在断言 X 是 Y 的父级的 parent(X,Y) 事实。

我需要一个规则chain(X,Y,L):如果X是Y的祖先,那么L是列表包含 X、Y 和 Y 的所有祖先,他们也是 X 的后代,按年龄降序排列(从大到小)。换句话说,我的列表应该包含所有将一个人与祖先联系起来的人。

例如: 如果 chain(peter,mary,[peter,paul,sue,mary]),那么 peterpaulpaulsue 的父级,suema​​ry 的父级>.

注意:我熟悉 stepSibling(a,b) 关系,他们的关系通过他们的父母 partner(X,Y) 来限定强>;其中兄弟姐妹 ab 通过关系 child(a,X)各自的父母 是他们的孩子强>孩子(b,Y)。 因此;我只是对两个兄弟姐妹共享一个共同父母的关系感到困惑。 ie. 可能如下所示的子关系:child(a,X)child(b,X)

【问题讨论】:

    标签: prolog


    【解决方案1】:

    这是对我们在早期 Prolog 课程中讨论的常见家谱问题的一种有趣的转折。我们先考虑一个简化,如果 X 是 Y 的祖先,ancestor(X,Y) 为真。

    所以你有一个谓词parent(X,Y) 表示X 是Y 的父级。你可以这样写ancestor/2

    % base case: your parent is an ancestor
    ancestor(X, Y) :- parent(X, Y).
    ancestor(X, Z) :- parent(X, Y), ancestor(Y, Z).
    

    使用这样的示例数据库应该可以正常工作:

    parent(peter, paul).
    parent(paul, sue).
    parent(sue, mary).
    

    这适用于像ancestor(peter, mary) 这样的查询,它与您想要的很接近。下一步是保留链条,看起来像这样:

    chain(X, Y, [X,Y])     :- parent(X, Y).
    chain(X, Z, [X|Chain]) :- parent(X, Y), chain(Y, Z, Chain).
    

    这似乎有效:

    ?- chain(peter, mary, X).
    X = [peter, paul, sue, mary] ;
    false.
    

    不过我很担心,因为您的问题提到了继兄弟姐妹,并且链条应该包括其他人。那只是谷壳还是您有其他要求?如果是这样,它们不会反映在您的示例中,因此我可能需要您用更多细节来补充您的问题。

    【讨论】:

    • 我所指的“其他”元素是关于“所有”其他成员,这些成员也与同一祖先链相关。你上面的例子完美地回答了我。例如。 ?-链(彼得,玛丽,X)X = [彼得,保罗,苏,玛丽]; // 这正是我所指的。我也成功地运行了这个程序。多谢! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多