家谱 - 有两个以上的家庭 children
Family trees - familes with more than two children
family(family_member(oleg, barmin, birth_date(6, 1, 98), false), family_member(kate, barmin, birth_date(1, 10, 97), true),
children(family_member(vasy, barmin, birth_date(5, 12, 07), true))).
family(family_member(artem, kudinov, birth_date(6, 1, 57), true), family_member(ann, kudinov, birth_date(1, 10, 67), false),
children(family_member(julia, barmin, birth_date(5, 12, 88), false))).
family(family_member(kola, avramov, birth_date(6, 1, 57), false), family_member(nastya, avramov, birth_date(1, 10, 67), false),
children(family_member(masha, avramov, birth_date(5, 12, 88), false),family_member(fedya, avramov, birth_date(5, 12, 88), false))).
family(family_member(ivan, petrov, birth_date(6, 1, 57), true), family_member(daria, petrov, birth_date(1, 10, 67), false),
children(family_member(a00000000, petrov, birth_date(5, 12, 88), false),family_member(warihaerh, petrov, birth_date(5, 12, 88), false),
family_member(b00000000, petrov, birth_date(5, 12, 88), false))).
family(family_member(ivan, ivanov, birth_date(6, 1, 57), true), family_member(daria, ivanov, birth_date(1, 10, 67), false),
children(family_member(a00000000, ivanov, birth_date(5, 12, 88), false),family_member(warihaerh, ivanov, birth_date(5, 12, 88), false),
family_member(orihthth, ivanov, birth_date(5, 12, 88), false), family_member(shgsgh, ivanov, birth_date(5, 12, 88), false))).
familyWifeWorkFalse(Y) :-
Y = family_member(_, _, _, false),
family(_, family_member(_, _, _, false), _).
oneChildrenMan(X) :-
family(X, _, children(_)).
twoChildrenMan(X) :-
family(X, _, children(_, _)).
moreTwoChildrenMan(X) :-
\+oneChildrenMan(X),
\+twoChildrenMan(X),
family(X, _, _).
大家好!我的 prolog 任务需要帮助。我有几个家庭,第一个变量是丈夫,第二个是妻子,第三个是children。
我需要创建一个规则,它将输出具有 3 个或更多 children 的家庭。我创建了输出为 1 和 2 children 的规则,然后尝试在第三条规则中排除它们。但是我得到了:
?- moreTwoChildrenMan(X).
false.
几天来我一直在努力完成自己的任务,但我没有得到任何结果。
有什么办法吗?
您的 moreTwoChildrenMan/1
谓词的问题是您错误地使用了 Prolog 的 backtracking。
目标否定运算符\+
强制Prolog的执行机制搜索先前目标的替代解决方案,而在moreTwoChildrenMan/1
的代码中oneChildrenMan(X)
之前没有目标.这就是谓词失败的原因。
但是,如果您只是将目标 family(X, _, _)
移动到目标 oneChildrenMan(X)
之前,它将为您提供所需的结果,因为现在执行将回溯 family(X, _, _)
的解决方案:
moreTwoChildrenMan(X) :-
family(X, _, _), % find some family member X
\+ oneChildrenMan(X), % filter out those with one child
\+ twoChildrenMan(X). % filter out those with two children
family(family_member(oleg, barmin, birth_date(6, 1, 98), false), family_member(kate, barmin, birth_date(1, 10, 97), true),
children(family_member(vasy, barmin, birth_date(5, 12, 07), true))).
family(family_member(artem, kudinov, birth_date(6, 1, 57), true), family_member(ann, kudinov, birth_date(1, 10, 67), false),
children(family_member(julia, barmin, birth_date(5, 12, 88), false))).
family(family_member(kola, avramov, birth_date(6, 1, 57), false), family_member(nastya, avramov, birth_date(1, 10, 67), false),
children(family_member(masha, avramov, birth_date(5, 12, 88), false),family_member(fedya, avramov, birth_date(5, 12, 88), false))).
family(family_member(ivan, petrov, birth_date(6, 1, 57), true), family_member(daria, petrov, birth_date(1, 10, 67), false),
children(family_member(a00000000, petrov, birth_date(5, 12, 88), false),family_member(warihaerh, petrov, birth_date(5, 12, 88), false),
family_member(b00000000, petrov, birth_date(5, 12, 88), false))).
family(family_member(ivan, ivanov, birth_date(6, 1, 57), true), family_member(daria, ivanov, birth_date(1, 10, 67), false),
children(family_member(a00000000, ivanov, birth_date(5, 12, 88), false),family_member(warihaerh, ivanov, birth_date(5, 12, 88), false),
family_member(orihthth, ivanov, birth_date(5, 12, 88), false), family_member(shgsgh, ivanov, birth_date(5, 12, 88), false))).
familyWifeWorkFalse(Y) :-
Y = family_member(_, _, _, false),
family(_, family_member(_, _, _, false), _).
oneChildrenMan(X) :-
family(X, _, children(_)).
twoChildrenMan(X) :-
family(X, _, children(_, _)).
moreTwoChildrenMan(X) :-
\+oneChildrenMan(X),
\+twoChildrenMan(X),
family(X, _, _).
大家好!我的 prolog 任务需要帮助。我有几个家庭,第一个变量是丈夫,第二个是妻子,第三个是children。 我需要创建一个规则,它将输出具有 3 个或更多 children 的家庭。我创建了输出为 1 和 2 children 的规则,然后尝试在第三条规则中排除它们。但是我得到了:
?- moreTwoChildrenMan(X).
false.
几天来我一直在努力完成自己的任务,但我没有得到任何结果。 有什么办法吗?
您的 moreTwoChildrenMan/1
谓词的问题是您错误地使用了 Prolog 的 backtracking。
目标否定运算符\+
强制Prolog的执行机制搜索先前目标的替代解决方案,而在moreTwoChildrenMan/1
的代码中oneChildrenMan(X)
之前没有目标.这就是谓词失败的原因。
但是,如果您只是将目标 family(X, _, _)
移动到目标 oneChildrenMan(X)
之前,它将为您提供所需的结果,因为现在执行将回溯 family(X, _, _)
的解决方案:
moreTwoChildrenMan(X) :-
family(X, _, _), % find some family member X
\+ oneChildrenMan(X), % filter out those with one child
\+ twoChildrenMan(X). % filter out those with two children