首先,我是 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 就位于两个语句的前面吗?
请让我知道您的反馈!
我想到了 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 时才安全,因此将其移至子句之后,这将使变量为 grounddif
子句移到它们可能毫无意义地被调用之前——由于回溯而经常被调用parent
或 person
然后需要一些其他方式来了解像男性或女性这样基本的东西,例如husband_wife
或 mother_father_child
通过它们的位置使其变得明显 - 可以使其更加具体,例如mother_father_daughter
和 mother_father_son