有没有办法在Prolog中注释参数和返回值?

时间:2014-02-15 04:54:05

标签: prolog

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是参数而C是返回值?在复杂的情况下,会有不同名称的谓词,我的用户应该如何知道哪个谓词是他想要使用的最终谓词?

3 个答案:

答案 0 :(得分:1)

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

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

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

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

通常(约定),输入参数是较早的参数,输出参数是后来的参数,但谓词“双向工作”,即。要么可以输入要么输出,这个规则不能成立。您的谓词就是这种情况:

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

任何参数都可以输入或输出,因此不需要对它们进行编码/解释,尽管您可能想要评论它是否兼有。

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

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

  • 将谓词明确命名为入口点,如上所述
  • 使用代码中的注释作为入口点的文档
  • 使用注释在同一物理部分中安排入口点 阻止说下面的谓词是入口点。

编辑:额外的事情:编码指南/其他答案。

  1. Coding guidelines for Prolog第3.8节中,它说'例如,mother_of(A,B)含糊不清;',所以我给出了不好的建议......也许acapelli的建议对此更有用。 / LI>

    在该文件中,还要看一下:

    • 3.5为辅助谓词选择合理的名称
    • 3.8选择谓词名称以帮助显示参数顺序
    • 3.13确定谓词名称是否应包含其操作类型
    • 4.1以明确定义的格式开始每个谓词(除了可能是辅助谓词)以及介绍性评论

    '?'用于识别将要提到的参数类型的系统在第21页上。

答案 1 :(得分:1)

一个有用的约定,由Markus Triska赞助,通过加入参数'名称'来构建谓词仿函数 - 具有广泛的适用意义。你的例子可能是

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,其他......有时需要这样的声明 - 通常检查正确性,通常是为了加快计算速度。

SWI-Prolog提供“正确”的结构化注释,IDE自动处理,并且有一个contribution旨在通过运行时检查来利用这些声明。

答案 2 :(得分:1)

是的,有评论和/或有意义的参数名称,

% 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的祖先”,所以这是一把双刃剑。

相关问题