gpt4 book ai didi

prolog - 在 Prolog 中创建侄子规则

转载 作者:行者123 更新时间:2023-12-01 14:35:55 24 4
gpt4 key购买 nike

使用家庭数据库,我需要在 swi-prolog 中创建一个侄女规则 (niece(X,Y)),其定义为“如果 X 是 Y 兄弟或姐妹的女儿,则 X 是 Y 的侄女”。这是具有我已经设计好的规则的给定数据库:

% family DB

grandfather(don,who).

father(don,ted).
father(don,barb).
father(don,paula).
father(greg,erin).
father(greg,austin).
father(wes,alyssa).
father(ted,jessica).
father(ted,david).
%mother(ted, john).

mother(audrey,ted).
mother(audrey,barb).
mother(audrey,paula).
mother(paula,erin).
mother(paula,austin).
mother(barb,alyssa).

married(don,audrey).
married(wes,barb).
married(greg,paula).

male(don).
male(ted).
male(wes).
male(greg).
male(austin).
male(david).

female(audrey).
female(barb).
female(paula).
female(alyssa).
female(jessica).
female(erin).

parent(X,Y) :-
father(X,Y)
; mother(X,Y).

grandfather(X,Y) :-
father(X,Z),
( father(Z,Y)
; mother(Z,Y)
).

samefather(X,Y) :-
father(F,X),
father(F,Y).

samemother(X,Y) :-
mother(M,X),
mother(M,Y).

sameparent(X,Y) :-
samefather(X,Y).
sameparent(X,Y) :-
samemother(X,Y),
not(samefather(X,Y)).

couple(X,Y) :-
married(X,Y),
married(X,Y).

这是我对侄女规则的初步尝试:
niece(X,Y) :-
parent(F,X),
sameparent(Y,F).

我的想法是使用 sameparent 规则来检查 Y 和 F 是否是 sibling ,然后检查 F 是否是 X 的父级。此规则目前不起作用。我仍在努力理解码合多个规则的语法。如果有人可以通过使用相同的逻辑来帮助我,将不胜感激。

最佳答案

删除不必要的规则:

parent(don,ted).
parent(don,barb).
parent(don,paula).
parent(greg,erin).
parent(greg,austin).
parent(wes,alyssa).
parent(ted,jessica).
parent(ted,david).

parent(audrey,ted).
parent(audrey,barb).
parent(audrey,paula).
parent(paula,erin).
parent(paula,austin).
parent(barb,alyssa).

male(don).
male(ted).
male(wes).
male(greg).
male(austin).
male(david).

female(audrey).
female(barb).
female(paula).
female(alyssa).
female(jessica).
female(erin).

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

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

sameparent(X,Y) :-
parent(A,X),
parent(A,Y).

给你 :
niece(X,Y) :-
female(X),
parent(Z,X),
sameparent(Z,Y),
Z \= Y.

一行一行的意思:
  • X 是 Y 的侄女,如果
  • X 是女性且
  • X 的一位 parent
  • 与 Y
  • 有一个共同的 parent
  • 谁不是他/她自己。

  • 这给你:
    | ?- niece(X,Y).

    X = alyssa
    Y = ted;

    X = alyssa
    Y = paula;

    X = jessica
    Y = barb;

    X = jessica
    Y = paula;

    X = erin
    Y = ted;

    X = erin
    Y = barb

    两次 因为在您的数据库的情况下,每个兄弟/姐妹共享相同的两个 parent 。

    例如,如果A是B的女儿,B是C的同父异母兄弟,那么A仍然是C的侄女。

    如果您希望该规则是错误的,并且仅当 B 和 C 是兄弟/姐妹(而不是一半)时 A 才是 C 的侄女,您可以将侄女规则更改为以下内容:
    sameFather(X,Y) :-
    father(A,X),
    father(A,Y).

    sameMother(X,Y) :-
    mother(A,X),
    mother(A,Y).

    niece(X,Y) :-
    female(X),
    parent(Z,X),
    sameFather(Z,Y),
    sameMother(Z,Y),
    Z \= Y.

    然后你不会得到重复的结果 niece(X,Y) .

    关于prolog - 在 Prolog 中创建侄子规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29663070/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com