从属条件的 Prolog 语法

问题描述 投票:0回答:1

首先,我是 Prolog 新手,所以请对我宽容一些...另外,我正在使用 SWI-Prolog, 所以我想对 SWI 使用正确的语法。

在这种情况下,我想定义继父母(特别是继母和继父)。 我当前的语法是这样的:

isStepFather(X, Y):-
    dif(X, Y),
    isMale(X),
    not(isParent(X, Y)),
    isMother(Z, Y), isHusband(X, Z).

首先,我知道有时“not”是“\=”或其他斜杠组合,那么我的“not”语句有更好的版本吗?另外,最后一行应该是这样的: “如果 Z 是 Y 的母亲,并且 X 是 Z 的丈夫,则 X 是 Y 的继父。”

我想将 2 个 Z 语句指定为单个想法/条件,因此我将它们放在同一行,但这有关系吗?或者是否有更好的方法来链接两个相互链接的条件,但不一定与其他条件链接?

最后,使用起来会不会更好/更优雅

isWife(Z, X)
代替
isHusband(X, Z)
这样 Z 就位于两个语句的前面吗?

请让我知道您的反馈!

prolog swi-prolog
1个回答
0
投票

我想到了 2 种合理的方法:

stepfather_child(SF, C) :-
    mother_child(M, C),
    husband_wife(SF, M),
    \+ father_child(SF, C).

...并且:

stepfather_child_alt(SF, C) :-
    dif(F, SF),
    mother_father_child(M, F, C),
    husband_wife(SF, M).

一些编程笔记:

  • 有意义的变量名比无意义的名称更有帮助
  • \+
    仅当变量为 ground 时才安全,因此将其移至子句之后,这将使变量为 ground
  • 为了提高一点性能,请将
    dif
    子句移到它们可能毫无意义地被调用之前——由于回溯而经常被调用
  • 描述其参数的谓词名称非常优雅和方便,特别是考虑到 Prolog 的关系性质
  • 分类是一种艺术形式,例如为什么有
    parent
    person
    然后需要一些其他方式来了解像男性或女性这样基本的东西,例如
    husband_wife
    mother_father_child
    通过它们的位置使其变得明显 - 可以使其更加具体,例如
    mother_father_daughter
    mother_father_son
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.