עבור לתוכן

פרולוג עץ משפחתי

Featured Replies

פורסם

אני בונה חוקים לעץ משפחתי.

חוק של "זוג" הוא- אם יש להם ילדים משותפים, הבעיה היא: שכשאני שואלת married(a,X) אז הוא יחזיר לי X= b כמספר הילדים.

איך אפשר לעצור את זה אחרי פעם אחת?

פורסם

השאלה לא מובנת.

פורסם
  • מחבר

הגדרתי את העובדות והחוקים הבאים (מצורפת סכימה של האילן יוחסין):


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]

פורסם

הסיבה שמופיע לך a שלוש פעמים היא מכיוון שיש לך שלושה ילדים פוטנציאלים שמתאימים לפרדיקט שכתבת (b,c,d).

הפתרון הפשוט הוא להשתמש בקאט (!) באופן הבא: קיים הורה X עם ילד Z וגם קיים הורה Y עם ילד Z, ועכשיו שמים קאט (כלומר מהרגע ש-Z עושה יוניפיקציה עם אחד הילדים הוא ישאר כך עד לסוף ההרצה), וגם X הוא זכר וגם Y נקבה, או X הוא נקבה וגם Y הוא זכר.

השימוש בקאט הוא מאוד חשוב, אבל גם צריך להיות מאוד זהירים איתו.

פורסם
  • מחבר

ככה?

זה לא עובד!


married(X,Y):- (parent(X,Z), parent(Y,Z)), !, ((male(X), fmale(Y)); (male(Y), fmale(X))).


פורסם

אני לא יודע באיזה פלייבור של פרולוג את משתמשת אבל גם ב-Sicstus וגם ב-SWI (שהיא גרסה חינמית) מה שכתבת עובד יופי (אם כי יש שם עודף סוגריים) ואפשר פשוט:

married(X,Y):-
parent(X,Z),
parent(Y,Z),
!,
(male(X),fmale(Y);male(Y),fmale(X)).

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים