פרולוג/תרגיל מסכם: סבא של עצמי

"אני סבא של עצמי" עריכה

קראו את השיר "אני סבא של עצמי":

עצות עריכה

  • לא כדאי להמציא שמות כי זה יהיה סתם מבלבל.
  • את כל העובדות כדאי לכתוב יחסית לדובר, כלומר:
    אב(אני,בני).
    אם(אשתי,בת_אשתי).

חלק א עריכה

  1. כתבו את כל העובדות הפשוטות נוסח "אב/2", "אם/2".
  2. כתוב את כל הצירופים של הזוגות הנשואים עם "נשואים/2".

חלק ב עריכה

בהתאם למתואר בשיר, הגדירו את החוקים הבאים:

  1. אב_חורג/2
  2. אם_חורגת/2
  3. הורה/2
  4. הורה_חורג/2

חלק ג עריכה

התחשבו בהורים חורגים והגדירו את החוקים:

  1. אחים/2
  2. אחים_חורגים/2

השתמשו ב"נשואים/2" על מנת לכתוב את החוקים:

  1. חותן/2
  2. חותן_חורג/2
  3. דוד/2
  4. דוד_חורג/2

חלק ד (ואחרון) עריכה

הגדירו את החוקים:

  1. סבתא/2
  2. סבתא_חורגת/2
  3. סבא_חורג/2

הרצה עריכה

אם הגדרתם הכל כהלכה, אמור להתקבל פלט מהצורה:

?- סבא_חורג(אני,אני).

Yes

?- סבא_חורג(_סבא,_נכד).

_סבא = 'אני',
_נכד = 'אני' ;

_סבא = 'אבי',
_נכד = 'בני' ;

_סבא = 'אבי',
_נכד = 'בת_אשתי' ;

No


 

שימו לב:

האמת, שבפלט מופיעות הרבה חזרות שהשומטו כאן.

פתרון עריכה

פתרון
לא(X):-
not(X).

אם(אשתי,בת_אשתי).
אם(אשתי,בני).
אב(אבי,אני).
אב(אני,בני).
נשואים(אני,אשתי).
נשואים(אבי,בת_אשתי).
%נשואים(X,Y):-נשואים(Y,X),!.
נשואים(אני,אשתי).
נשואים(אבי,בת_אשתי).

אב_חורג(_אב_חורג,_בן_חורג):-
	אם(_אם,_בן_חורג),
	נשואים(_אב_חורג,_אם),
	לא(אב(_אב_חורג,_בן_חורג)).

אם_חורגת(_אם_חורגת,_בן_חורג):-
	אב(_אב,_בן_חורג),
	נשואים(_אב,_אם_חורגת),
	לא(אם(_אם_חורגת,_בן_חורג)).

חותן(_חותן,_מחותן):-
	נשואים(_מחותן,_בן_הזוג),
	הורה(_חותן,_בן_הזוג).

חותן_חורג(_חותן,_מחותן):-
	נשואים(_מחותן,_בן_הזוג),
	הורה_חורג(_חותן,_בן_הזוג).

הורה(_הורה,_ילד):-
	אב(_הורה,_ילד);
	אם(_הורה,_ילד).

הורה_חורג(_הורה,_ילד):-
	(אב_חורג(_הורה,_ילד);
	אם_חורגת(_הורה,_ילד)), לא(הורה(_הורה,_ילד)).

אחים(_אח1,_אח2):-
	אב(_אב,_אח1),
	אם(_אם,_אח1),
	אב(_אב,_אח2),
	אם(_אם,_אח2),
	_אח1\=_אח2.

אחים_חורגים(_אח1,_אח2):-
	הורה(_הורה,_אח1),
	הורה(_הורה,_אח2),
	_אח1\=_אח2.

דוד(_דוד,_אחיין):-
	הורה(_הורה,_אחיין),
	אחים(_הורה,_דוד).

דוד_חורג(_דוד,_אחיין):-
	(הורה(_הורה,_אחיין),
	אחים_חורגים(_הורה,_דוד));
	(הורה_חורג(_הורה,_אחיין),
	אחים(_הורה,_דוד));
	(הורה_חורג(_הורה,_אחיין),
	אחים_חורגים(_הורה,_דוד)).

סבתא(_סבתא,_נכד):-
	אם(_סבתא,_הורה),
	הורה(_הורה,_נכד).

סבתא_חורגת(_סבתא,_נכד):-
	(אם(_סבתא,_הורה),
	הורה_חורג(_הורה,_נכד));
	(אם_חורגת(_סבתא,_הורה),
	הורה(_הורה,_נכד));
	(אם_חורגת(_סבתא,_הורה),
	הורה_חורג(_הורה,_נכד)).

סבא_חורג(_סבא,_נכד):-
	סבתא_חורגת(_סבתא,_נכד),
	נשואים(_סבא,_סבתא).