2009-03-24 20 views
8

मैंने किया था यह लेकिन इसके जवाब नहीं दिखा रहा जब मैं भाइयों, बहनों, मामा के बारे में पूछना, चाचीProlog वंश-वृक्ष

यह मैं क्या लिखा है, क्या गलत है क्या है?

/*uncle(X, Y) :– male(X), sibling(X, Z), parent(Z, Y).*/ 
/*uncle(X, Y) :– male(X), spouse(X, W), sibling(W, Z), parent(Z, Y).*/ 

uncle(X,Y) :- 
    parent(Z,Y), brother(X,Z). 

aunt(X,Y) :- 
    parent(Z,Y), sister(X,Z). 

sibling(X, Y) :- 
     parent(Z, X), 
     parent(Z, Y), 
     X \= Y. 

sister(X, Y) :- 
     sibling(X, Y), 
     female(X). 

brother(X, Y) :- 
     sibling(X, Y), 
     male(X). 

parent(Z,Y) :- father(Z,Y). 
parent(Z,Y) :- mother(Z,Y). 

grandparent(C,D) :- parent(C,E), parent(E,D). 

aunt(X, Y) :– female(X), sibling(X, Z), parent(Z, Y). 
aunt(X, Y) :– female(X), spouse(X, W), sibling(W, Z), parent(Z, Y). 

male(john). 
male(bob). 
male(bill). 
male(ron). 
male(jeff). 

female(mary). 
female(sue). 
female(nancy). 

mother(mary, sue). 
mother(mary, bill). 
mother(sue, nancy). 
mother(sue, jeff). 
mother(jane, ron). 

father(john, sue). 
father(john, bill). 
father(bob, nancy). 
father(bob, jeff). 
father(bill, ron). 

sibling(bob,bill). 
sibling(sue,bill). 
sibling(nancy,jeff). 
sibling(nancy,ron). 
sibling(jell,ron). 

और एक और बात, मैं भाई के शासन को कैसे अनुकूलित करूं ताकि एक्स खुद ही भाई न हो।

उत्तर

5

ऐसा लगता है कि आप अपने कुछ सिद्धांत गलत हैं या गायब हैं, अगर आप आरेख को दोहराने की कोशिश कर रहे हैं।

लापता:

female(jane). 

father(john, bob). 

गलत:

father(john, sue). 

इस संघर्ष करने के लिए भाई नियम के कारण हो सकता। लेकिन मुझे prolog

+0

+1, मैं उन –

3

भाई का नियम पहले से ही सत्यापित करता है कि brother(bob, bob) विफल हो जाएगा क्योंकि यह sibling(X, Y) पर कॉल करता है, जो चेक को X \= Y पहले से सुनिश्चित करने के लिए करता है।

इसके अलावा, यह लगता है जैसे कि सब कुछ मेरे मशीन पर काम कर रहा है, लेकिन मैं इन पंक्तियों पर डैश बदलना पड़ा:

aunt(X, Y) :– female(X), sibling(X, Z), parent(Z, Y). 
aunt(X, Y) :– female(X), spouse(X, W), sibling(W, Z), parent(Z, Y). 

रहे हैं:

aunt(X, Y) :- female(X), sibling(X, Z), parent(Z, Y). 
aunt(X, Y) :- female(X), spouse(X, W), sibling(W, Z), parent(Z, Y). 

हाँ, वे समान लग रही है, लेकिन शीर्ष संस्करण में डैश थोड़ा अधिक हैं ... और जब मैंने फ़ाइल से "परामर्श" किया तो समस्याएं उत्पन्न हुईं।

मैंने केवल इसलिए पकड़ा क्योंकि मैंने नोटपैड ++ के लिए प्रोलॉग रंग योजना बनाई है, अगर कोई दिलचस्पी लेता है तो मैं इसे ऑनलाइन पोस्ट कर सकता हूं।

+0

का परीक्षण नहीं किया था अब डैश शायद उन्हें या एन कुछ स्मार्ट शब्द संसाधक –

+0

द्वारा बनाई डैश हैं हाँ मेरा अनुमान है कि यह नकल और चिपकाया था बाकी के अलावा कहीं बाकी लिखा गया था :) –

1

एक्स के लिए भाई के नियम को अनुकूलित करने के लिए खुद भाई नहीं है।

आप क्या करना चाहिए:

brother(X, Y) :- 
     sibling(X, Y), 
     male(X), 
     not X=Y. 
1

आप तथ्यों के एक मजबूत डेटाबेस और एक बहुत ही महत्वपूर्ण विधेय parent(X,Y) कहा जाता है। दृष्टिकोण के बारे में तर्कसंगत सोचें।

  • कौन एक भाई/बहन है:
    क) एक पुरुष/महिला है, इस प्रकार male(X) या female(X) विधेय
    ख) एक्स के अंदर होना चाहिए और वाई में एक ही है, लेकिन उपयोग करने के लिए सावधान रहना होगा या तो mother या father फ़ंक्शन, क्योंकि अन्यथा परिणाम दो बार दिखाया जाएगा।
    पीएस: सुनिश्चित करें कि X/=Y। =)

पूर्व .:
brother(X,Y):- X/=Y, male(X), father(Father,X), father(Father,Y).

  • कौन चाचा/चाची (थोड़ा मुश्किल है, लेकिन नहीं एक बहुत) है:
    एक) एक पुरुष/महिला है।
    बी) चाची/चाचा भाई की माँ या पिता की बहन/भाई है।

पूर्व .:
aunt(X,Y):- female(X), parent(Parent,Y),sister(X,Parent).

पुनश्च: चाची भी भाई माँ या पिता (चाचा की पत्नी) के भाई की पत्नी माना जा सकता है। लेकिन इस मामले में आपको एक नया तथ्य पेश करने की आवश्यकता है जो married_couple व्यक्त करता है।

aunt(X,Y):- female(X),
parent(Parent,Y),
(sister(X,Parent); (brother(Parent,Uncle),married_couple(Uncle,X))).

आशा इस काम करता है;)

1

आपका चाची/2 विधेय एक साथ रखा नहीं कर रहे हैं, इसलिए Prolog मान लिया गया दादा-दादी/2 चाची/2 है। उन्हें एक साथ नीचे की तरह रखें या उपयोग

:- discontiguous(aunt/2). 

आप पति या पत्नी/2 का उपयोग करें, लेकिन यह परिभाषित नहीं करते। इसके अलावा, प्रोलॉग मानता है कि वहां एक भाई/2 अनुमानित होना चाहिए और पिता/2 का उपयोग करना चाहिए। ऐसा इसलिए होता है क्योंकि आप अपने केबी के नीचे भाई बहनों की सूची परिभाषित करते हैं। दोबारा, उन्हें नीचे की तरह एक साथ रखें।

अन्य उत्तरों में कहा गया है, तो आप (एक्स = वाई) का उपयोग नहीं कर सकते हैं।

parent(Z,Y) :- father(Z,Y) ; mother(Z,Y). 

sibling(bob,bill). 
sibling(sue,bill). 
sibling(nancy,jeff). 
sibling(nancy,ron). 
sibling(jell,ron). 

sibling(X,Y) :- 
    parent(A,X), 
    parent(A,Y), 
    not(X = Y). 


sister(X, Y) :- 
     sibling(X, Y), 
     female(X), 
     not(X = Y). 

brother(X, Y) :- 
     sibling(X, Y), 
     male(X), 
     not(X = Y). 

grandparent(C,D) :- parent(C,E), parent(E,D). 

aunt(X,Y) :- 
    parent(Z,Y), sister(X,Z). 
aunt(X, Y) :- female(X), sibling(X, Z), parent(Z, Y). 
% aunt(X, Y) :- female(X), spouse(X, W), sibling(W, Z), parent(Z, Y). 

uncle(X,Y) :- 
    parent(Z,Y), brother(X,Z). 


male(john). 
male(bob). 
male(bill). 
male(ron). 
male(jeff). 

female(mary). 
female(sue). 
female(nancy). 
female(jane). 

mother(mary, sue). 
mother(mary, bill). 
mother(sue, nancy). 
mother(sue, jeff). 
mother(jane, ron). 

father(john, sue). 
father(john, bill). 
father(bob, nancy). 
father(bob, jeff). 
father(bill, ron). 
0

पहले:

अपने कोड की शुरुआत पर अपने तथ्यों डाला!

और भाई के लिए:

equal(X,Y) :- 
    X=Y. 

different(X,Y):- 
    not(equal(X,Y)). 

brother(X, Y) :- 
    sibling(X, Y), 
    male(X), 
    different(X,Y). 
संबंधित मुद्दे