פורסם 2007 באוקטובר 2918 שנים אני בונה חוקים לעץ משפחתי.חוק של "זוג" הוא- אם יש להם ילדים משותפים, הבעיה היא: שכשאני שואלת married(a,X) אז הוא יחזיר לי X= b כמספר הילדים.איך אפשר לעצור את זה אחרי פעם אחת?
פורסם 2007 באוקטובר 2918 שנים מחבר הגדרתי את העובדות והחוקים הבאים (מצורפת סכימה של האילן יוחסין):male(a).male(b).male(t).male(e).male(g).male(h).male(i).male(r).fmale(aa).fmale(ee).fmale(c).fmale(f).fmale(d).fmale(s).parent(a,b).parent(a,c).parent(a,d).parent(aa,b).parent(aa,c).parent(aa,d).parent(e,f).parent(e,g).parent(ee,g).parent(ee,f).parent(d,h).parent(d,i).parent(g,h).parent(g,i).parent(f,s).parent(f,r).parent(t,s).parent(t,r).father(X,Y):- parent(X,Y), male(X). % x is father of y mother(X,Y):- parent(X,Y), fmale(X).ברצוני להגדיר חוק האומר שזוג נשוי הוא גבר ואשיה שיש להם ילידם משותפים לדוגמא:,married(X,Y):- (parent(X,Z), parent(Y,Z), male(X), fmale(Y)); (parent(X,Z), parent(Y,Z), male(Y), fmale(X)). [code]שאילתא לדוגמא: [code]?- married(X,aa).X = a ;X = a ;X = a ;noמה לשנות כדי שבשאילתא הוא לא יחזיר לי מספר תשובות כמספר הילדים?[attachment deleted by admin]
פורסם 2007 באוקטובר 3018 שנים הסיבה שמופיע לך a שלוש פעמים היא מכיוון שיש לך שלושה ילדים פוטנציאלים שמתאימים לפרדיקט שכתבת (b,c,d).הפתרון הפשוט הוא להשתמש בקאט (!) באופן הבא: קיים הורה X עם ילד Z וגם קיים הורה Y עם ילד Z, ועכשיו שמים קאט (כלומר מהרגע ש-Z עושה יוניפיקציה עם אחד הילדים הוא ישאר כך עד לסוף ההרצה), וגם X הוא זכר וגם Y נקבה, או X הוא נקבה וגם Y הוא זכר.השימוש בקאט הוא מאוד חשוב, אבל גם צריך להיות מאוד זהירים איתו.
פורסם 2007 באוקטובר 3118 שנים מחבר ככה?זה לא עובד!married(X,Y):- (parent(X,Z), parent(Y,Z)), !, ((male(X), fmale(Y)); (male(Y), fmale(X))).
פורסם 2007 באוקטובר 3118 שנים אני לא יודע באיזה פלייבור של פרולוג את משתמשת אבל גם ב-Sicstus וגם ב-SWI (שהיא גרסה חינמית) מה שכתבת עובד יופי (אם כי יש שם עודף סוגריים) ואפשר פשוט:married(X,Y):- parent(X,Z), parent(Y,Z), !, (male(X),fmale(Y);male(Y),fmale(X)).
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.