【问题标题】:How to model the "sister" relationship so that it implies the gender如何为“姐妹”关系建模,使其暗示性别
【发布时间】:2020-06-04 23:47:34
【问题描述】:

您如何定义母亲/父亲/姐妹/兄弟关系,以便断言sister(bart, maggie) 使?- female(maggie) 评估为真?

我正在研究一个玩具家庭关系问题。这就是我所拥有的:

parent(bart, homer).
parent(bart, marge).
parent(lisa, homer).
parent(lisa, marge).

male(homer).
male(bart).
female(marge).
female(lisa).

mother(X,Y) :- female(Y), parent(X,Y).
father(X,Y) :- male(Y), parent(X,Y).

sister(X,Y) :- female(Y), father(X,F), father(Y,F), mother(X,M), mother(Y,M), X/=Y.

我希望能够做到以下几点:

sister(bart, maggie).

?- female(maggie).
% expect yes

即支持“常识”定义,如果您断言 maggie 是 bart 的妹妹,我们知道 maggie 是女性,同时仍然根据我已经拥有的父母/性别断言获得 sister(bart, lisa) 为真。

【问题讨论】:

  • 所以写一个规则来支持这个推论。请注意,如果某人既被明确断言为女性又被断言为某人的妹妹,您将有两种方式证明她是女性。

标签: prolog


【解决方案1】:

事实上,您的系统期望男性/女性和父母是一个事实,并通过规则

派生出父亲/母亲/兄弟/姐妹

你可以这样做:

% X is female if it is somebody's sister.
female(X) :- sister(_,X).

但结合其他规则,它可能不会终止(如果她是某人的妹妹,她是女性,如果她是女性,她是某人的妹妹......)

您可以设置不同的事实和规则来扭转这种做法,例如确定基本事实是姐妹、母亲、儿子、女儿……但是您需要确定数据库中哪些构成基本信息,哪些构成派生信息。如果您希望从任何事物中派生出任何事物,同时遵循简单的规则,您很快就会得到一个不会终止的系统,并探索越来越多的方法来获取已知信息。

如果您想拥有一组更丰富的推理规则(例如,如果 X 暗示 Y 并且 Y 为假,则 X 为假),并确保您的流程终止,不会多次给您结果等,你需要编写(或借用)你自己的规则解释器,也就是你自己的推理引擎。

【讨论】:

  • 我认为tabling 可能有助于(重新)获得所需但目前缺少的一般性,但对该主题的讨论可能会让任何新手发疯。你怎么看?
  • 制表有帮助 - 虽然我认为更重要的是要进行真正的推理,我们不能在假设的封闭世界中停止深度优先搜索。一旦我们知道必须有更多......我们可以花很长时间讨论更多。
【解决方案2】:

常识推理通常方式对于任何通用编程语言来说都太复杂了。对于这个非常有限的领域,我们可以在 SWI-Prolog 中原型化一个简单的元解释器,从规则体中概括目标选择,并通过表格避免循环:


:- autoload(library(tabling)).
:- table solve/1, rule/2.

solve(F) :-
    rule(F,[]).
solve(H) :-
    rule(H,B),
    solve_b(B).

% allowed builtins
solve(X\=Y) :- X\=Y.

solve_b([]).
solve_b(B) :-
    select(G,B,R),
    solve(G),
    solve_b(R).

rule(parent(bart, homer), []).
rule(parent(bart, marge), []).
rule(parent(lisa, homer), []).
rule(parent(lisa, marge), []).

rule(male(homer), []).
rule(male(bart), []).
rule(male(M), [father(_,M)]).
rule(male(M), [brother(_,M)]).

rule(female(marge), []).
rule(female(lisa), []).
rule(female(F), [mother(_,F)]).
rule(female(F), [sister(_,F)]).

rule(mother(X,Y), [female(Y), parent(X,Y)]).
rule(father(X,Y), [male(Y), parent(X,Y)]).

rule(sister(X,Y), [
         female(Y),
         sibling(X,Y)
     ]).
rule(brother(X,Y), [
         male(Y),
         sibling(X,Y)
     ]).

rule(sibling(X,Y), [
         father(X,F),
         father(Y,F),
         mother(X,M),
         mother(Y,M),
         X\=Y
     ]).
rule(sister(bart,maggie), []).

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    • 2020-01-31
    • 2014-11-07
    • 1970-01-01
    相关资源
    最近更新 更多