代码之家  ›  专栏  ›  技术社区  ›  Gqqnbig

Prolog中是否有注释参数和返回值的方法?

  •  0
  • Gqqnbig  · 技术社区  · 12 年前
    parent(mel, joan).
    parent(jane, betty).
    parent(jane, tom).
    parent(richard, adam).
    parent(richard, rosa).
    parent(joan, fran).
    

    例如,有人要求我查找父母的所有祖先。我给了他密码:

    ancestor(P,C) :- parent(P, C).
    ancestor(P,C) :- ancestor(P,P1), parent(P1, C).
    

    但我的朋友仍然不知道如何使用谓词。他这样称呼它吗

    ancestor(richard, C) 或 ancestor(C, richard) ?

    有没有一种方法可以注释 P 是参数while C 返回值是多少?在复杂的情况下,会有不同名称的谓词,我的用户应该如何知道哪个谓词是他要使用的最终谓词?

    3 回复  |  直到 12 年前
        1
  •  1
  •   magus    12 年前

    为了帮助理解人类可读的含义,可以添加一个额外的谓词,将参数记录为可读的名称/值对:

    entry_ancestor_of(ancestor=P, descendent=C) :-
        ancestor(P,C).
    
    ?- entry_ancestor_of(ancestor=richard, descendent=C).
    C = adam .
    

    上面,后缀*ancestor_of*表示参数1是参数2的祖先,因此仔细命名谓词可以使其更清晰。

    通常(惯例),输入参数是较早的参数,输出参数是较晚的参数,但如果谓词“双向工作”,即可以是输入或输出,则该规则无法成立。谓词的情况如下:

    ?- entry_ancestor_of(ancestor=X, descendent=adam).
    X = richard .
    

    任何一个参数都可以是输入或输出,因此不需要对它们进行编码/解释,尽管您可能希望说明这两种方式都有效。

    我通常会通过在谓词旁边的注释中放置上述两种用法的示例来注释这些“灵活”谓词。

    对于入口点标签,只需执行以下一项或多项操作:

    • 将谓词显式命名为入口点,如上所述
    • 使用代码中作为入口点的注释记录
    • 用注释在同一物理部分中排列入口点 块表示下面的谓词是入口点。

    编辑:额外内容:编码指南/其他答案。

    1. 在里面 Coding guidelines for Prolog ,第3.8节,它说“例如,mother_of(A,B)不明确;”,所以我对此给出了坏建议。。也许阿卡佩利的建议在这方面会更有用。

    在该文档中,还可以查看:

    • 3.5为辅助谓词选择合理的名称
    • 3.8选择谓词名称以帮助显示参数顺序
    • 3.13决定谓词名称是否应包含其操作的类型
    • 4.1每个谓词(可能是辅助谓词除外)都以定义良好的格式开头

    “?”用于识别将要提及的参数类型的系统见第21页。

        2
  •  1
  •   CapelliC    12 年前

    有用的 习俗 ,例如由赞助 Markus Triska ,通过连接参数“name”来构建谓词函子-在广泛适用的意义上。你的例子可能是

    parent_child(mel, joan).
    ...
    
    ancestor_descendant(P, C) :- parent_child(P, C).
    ancestor_descendant(A, D) :- ancestor_descendant(A, I), parent_child(I, D).
    

    同样,ISO Prolog,以及例如SWI Prolog库,也试图遵循这一策略。

    例如

    atom_codes(Atom, Codes) :- ...
    

    WRT声明 类型 和 地位 对于参数,一些Prolog提供声明-例如Turbo Prolog、ECLiPSe等。。。有时需要这样的声明——通常是为了检查正确性,通常是为了加快计算速度。

    SWIProlog提供了“简单”的结构化注释,IDE自动处理 contribution 旨在通过运行时检查利用此类声明。

        3
  •  1
  •   Will Ness Derri Leahy    12 年前

    是的,带有注释和/或有意义的参数名称,

    % ancestor( ?Ancestor, ?Descendent).
    ancestor(P,C) :- parent(P, C).
    ancestor(P,C) :- ancestor(P,P1), parent(P1, C).
    

    ? 表示参数既可以用作输入(调用时已设置),也可以用作输出(调用时尚未设置)。

    我认为,《Prolog的艺术》中提倡的惯例是,将谓词的名称放在其第一个参数之后,以获得预期的参数顺序: P “是” ancestor C 。可能是“ancestor_of”。但如果你用这个名字,不熟悉这个习惯的人可能会读到 ancestor_of(P,C) 因为“P的祖先是C”,所以这是一把双刃剑。

    推荐文章