2017-04-10 4 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, _, _). 

こんにちは!私はプロローグの仕事に助けが必要です。私はいくつかの家族を持っています。最初の変数は夫で、2番目は妻で、3番目は子供です。 3人以上の子供がいる家族を出力するルールを作成する必要があります。私は1,2人の子供が出産してルールを作り、第3のルールでそれらを除外しようとしています。しかし、私は得た:ファミリーツリー - 2人以上の子供がいるファミレス

?- moreTwoChildrenMan(X). 
false. 

私は数日間、自分の仕事を完了するためにトールされているが、私は結果を得るdidnt。 これを行う方法はありますか?

答えて

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 
関連する問題