2017-04-10 15 views
0
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, _, _). 

안녕하십니까? 내 프롤로그 작업에 도움이 필요해. 나는 첫 번째 변수가 husbend이고 두 번째 변수가 wifes이고 세 번째 변수가 자식 인 여러 패밀리가 있습니다. 3 명 이상의 자녀가있는 가족을 출력하는 규칙을 만들어야합니다. 나는 한두 명의 어린이를 배출하는 규칙을 세 번째 규칙에서 배제하려고 시도했다. 하지만 내가 가지고있어 :패밀리 트리 - 2 명 이상의 어린이가있는 familes

?- moreTwoChildrenMan(X). 
false. 

나는 며칠 동안 작업을 완료하려고 노력하고있다. 그러나 나는 어떤 결과도 얻지 못했다. 어떻게해야할까요?

답변

0

moreTwoChildrenMan/1 술어의 문제점은 Prolog의 backtracking을 잘못 사용한다는 것입니다.

목표 부정화 연산자 \+은 이전 목표에 대한 대체 솔루션을 Prolog 검색 실행 메커니즘에 강제로 적용하고 moreTwoChildrenMan/1 코드에는 oneChildrenMan(X) 이전의 목표가 없습니다. 이것이 술어가 실패하는 이유입니다.

하지만 당신은 단지 목표 전에 목표 family(X, _, _)를 이동하는 경우 현재 실행 family(X, _, _)에 대한 솔루션을 역 추적하기 때문에 oneChildrenMan(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