2017-04-10 72 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,第二個是一個妻子和第三個是孩子。 我需要創建一個規則,將輸出家庭用3個多的孩子。我創建的規則與一個和兩個孩子的輸出不是試圖排除它們在第三條規則。但我得到了:家譜 - 年輕人家庭有兩個以上孩子

?- moreTwoChildrenMan(X). 
false. 

我一直努力完成我的自我幾天的任務,但我沒有得到任何結果。 是否有任何想法如何做到這一點?

回答

0

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