Prolog家庭关系我如何实施有一个女人的孩子?

时间:2015-01-16 12:43:48

标签: prolog

在数据中,我有gender(_name,_gender)parent(_parent,_child)的基本事实, 我也实施其他规则。 我该如何实施这条规则:

has_child_from_one_woman(_person):- 

我这样做

has_child_from_one_woman(_person) :-
    parents(_mom,_person,_),
    not(parents(_other_mom,_person,__)),
    not(_mom \= _other_mom).

这是真的吗? 父母的第三个参数是下划线

parents(_mother,_father,_child) :-
    mother(_mother,_child),
    father(_father,_child).

1 个答案:

答案 0 :(得分:1)

如果一个女儿的父母至少有一个女性,并且没有其他孩子有另一个女人作为他/她的母亲,那么只有一个女人的孩子。把它翻译成Prolog ......

has_children_from_one_woman(Man):-
    parent(Man, Child),
    parent(Woman, Child),
    gender(Woman, female),
    dif(Woman, Man),
    \+ (parent(Man, Child1),
        parent(Woman1, Child1),
        gender(Woman1, female),
        dif(Woman1, Man),
        dif(Woman1, Woman)).

如果同一个Man多次,如果他与该女性有一个以上的孩子,则上述规则得到满足。你可以在最后放一个切口以避免这种情况。

此外,您可以使用setof/3获取至少有一个Man个孩子的所有女性的列表,并检查该列表中是否只有一个元素。

has_children_from_one_woman(Man):-
    setof(Woman,
          Child^(parent(Man, Child),
                 parent(Woman, Child),
                 gender(Woman, female),
                 dif(Woman, Man)),
          [_]).