רברסי בפרולוג - עמוד 2 - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

רברסי בפרולוג


Dano

Recommended Posts

כמובן! (וגם רצוי לשים אותן עם קאט(!) כדי שלא יחזיר 2 תשובות זהות עם תלחץ ';' )

זהו אף פעם לא הבנתי תקאט הזה, מתי מומלץ לשים אותו..מתי צריך?

ועוד משהו אי אפשר לזמן איזה חוק שאני בעצם עושה מינוס למשתנה כמו

AB(-turn).

ויש לי את המשתנה turn כנתון..?

קישור לתוכן
שתף באתרים אחרים

וואו... קאט יכול להיות הרצאה של שעה... בקצרה, אני אצטט:

"The CUT goal succeeds and commits Prolog to all choices made since the parent goal was unified with the head of the clause the CUT is in"

כלומר, אחרי קאט פרולוג מחוייב לכל ההחלטות שנעשו עם הקריאה לפרדיקט שמכיל אותו.

ז"א במקרה של תנאי העצירה, אם הוא מצליח

diag(_,8,_[]):-!.

אז הוא כבר לא ינסה להכנס לכלל שמתחת שמחפש את האיבר הבא באלכסון.

מתי צריך זה כבר שאלה אחרת (והרבה יותר מורכבת). יש קאטים שנקראים אדומים וכאלה ירוקים - כלומר כאלה שבלעדיהם התוכנית פשוט מחזירה תשובה לא נכונה, וכאלה שמשמשים לאופטימיזציה.

דוגמא נוספת לשימוש בקאט היא השלילה:

neg(X):-X,!,fail.
neg(X).

דרך אגב, במקרה הזה לא חייבים קאט אפשר פשוט לדרוש X>8 וגם Y>8 בפרדיקט.

קישור לתוכן
שתף באתרים אחרים

וואו... קאט יכול להיות הרצאה של שעה... בקצרה, אני אצטט:

"The CUT goal succeeds and commits Prolog to all choices made since the parent goal was unified with the head of the clause the CUT is in"

כלומר, אחרי קאט פרולוג מחוייב לכל ההחלטות שנעשו עם הקריאה לפרדיקט שמכיל אותו.

ז"א במקרה של תנאי העצירה, אם הוא מצליח

diag(_,8,_[]):-!.

אז הוא כבר לא ינסה להכנס לכלל שמתחת שמחפש את האיבר הבא באלכסון.

מתי צריך זה כבר שאלה אחרת (והרבה יותר מורכבת). יש קאטים שנקראים אדומים וכאלה ירוקים - כלומר כאלה שבלעדיהם התוכנית פשוט מחזירה תשובה לא נכונה, וכאלה שמשמשים לאופטימיזציה.

דוגמא נוספת לשימוש בקאט היא השלילה:

neg(X):-X,!,fail.
neg(X).

דרך אגב, במקרה הזה לא חייבים קאט אפשר פשוט לדרוש X>8 וגם Y>8 בפרדיקט.

אתה מתכוון X וY קטנים מ8..?

קישור לתוכן
שתף באתרים אחרים

אופ..דאבל :kopfpatsch:[br]פורסם בתאריך: 17.10.2007 בשעה 15:19:50


אוקי בעיה...

אני בחוק של בצע מהלך,

עכשיו אני צריך להפוך כמובן במיקום הנתון את התא לתא שלי, עכשיו,

אני צריך לבדוק את כל האפשרויות שיש לי, ואם המהלך נגיד גם יהפוך לי למעלה וגם באלכסון שמאלה, אז בעצם זה ייקח את הלוח

ויחזיר לי 2 תשובות ללוח...ואני רוצה ש2 הפעולות יבוצעו בלוח אחד,

מישהו הבין?

קישור לתוכן
שתף באתרים אחרים

מה הבעיה? פשוט תשנה את כל מה שחוקי לשנות (אורך, רוחב ואלכסונים) ותחזיר את הלוח החדש. כמו שמקודם בדקת אם צעד הוא חוקי, כעת תשנה ערכים ברשימה רק אם הם יוצרים שינוי חוקי, ותעדכן את הרשימה(הלוח) שלך.

קישור לתוכן
שתף באתרים אחרים

מה הבעיה? פשוט תשנה את כל מה שחוקי לשנות (אורך, רוחב ואלכסונים) ותחזיר את הלוח החדש. כמו שמקודם בדקת אם צעד הוא חוקי, כעת תשנה ערכים ברשימה רק אם הם יוצרים שינוי חוקי, ותעדכן את הרשימה(הלוח) שלך.

אבל כשאתה מזמן את החוק של בצע מהלך, אז הוא הולך לראשון אוקי משנה את השורה ומחזיר את הלוח החדש, ואז הוא ממשיך לחוק בצע מהלך הבא, ושוב משנה את הלוח המקורי ומחזיר עוד לוח עם השינוי החדש..ככה שיהיה כאילו הרבה אפשרויות לוחות ולא כל הפעולות יבוצעו על לוח אחד...

קישור לתוכן
שתף באתרים אחרים

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

ברור שלכל מקום בעץ הרקורסיה יש לוח שונה, אבל כשחוזרים מסוף החיפוש בעץ, הרקורסיה מחזירה אותי ללוח המקורי ובנוסף אני עכשיו יודע באיזה מהלך אני עשוי להרוויח הכי הרבה - וזה המהלך שאני אבחר. סבבה?

קישור לתוכן
שתף באתרים אחרים

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

ברור שלכל מקום בעץ הרקורסיה יש לוח שונה, אבל כשחוזרים מסוף החיפוש בעץ, הרקורסיה מחזירה אותי ללוח המקורי ובנוסף אני עכשיו יודע באיזה מהלך אני עשוי להרוויח הכי הרבה - וזה המהלך שאני אבחר. סבבה?

חח אוקי זה מצחיק, אני לא דיברתי על העץ זה בכלל לא קשור, אני יודע איך עץ מינימקס עובד, וזה בכלל לא העניין פה.

מה שאני דיברתי זה חוק של בצע_מהלך, וה"אפשרויות" שדיברתי עליהם זה שמהלך יכול גם לאכול בשורה וגם טור וגם אלכסון...

מצטער שלא הבנת

קישור לתוכן
שתף באתרים אחרים

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

קישור לתוכן
שתף באתרים אחרים

אוקי, זה היה חפירה...

עכשיו אני עדיין בפעולה של בצע_מהלך,

יש לי רשימה של שורה, רשימה של טור, רשימה של אלכסון 1, ורשימה של אלכסון 2...

עכשיו אני צריך להחליף אותם בלוח הנתון שיש לי...

לשורה נגיד: (Pos זה המיקום של השורה בלוח)

מצא_כל(_שורה,(מיקום_איבר(H,_לוח,_שורה),H<Pos),_התחלה),

שרשר(_התחלה,_שורה_חדשה,_זמני),

מצא_כל(_שורה,(מיקום_איבר(H,_לוח,_שורה),H>Pos),_סוף),

שרשר(_זמני,_סוף,_לוח_חדש).

ומטור אני מסתבך, אני רוצה לעשות בדרך פשוטה ונוחה לעין ולא כזאת שכבר מוציאה תאברים הפנימיים ונראה לי שאתם יודעים למה אני מתכוון,

יש הצעות?

קישור לתוכן
שתף באתרים אחרים

פשוט תשחלף (כלומר תשתמש בפרדיקט שהופך עמודות לשורות ומחזיר את הלוח החדש), תחליף את העמודה (עכשיו היא שורה אז אתה יכול להשתמש במה שכתבת!) ותבצע שוב שחלוף.

לגבי אלכסון... שם תצטרך לעבוד קצת יותר קשה. כרגע אין לי רעיון למשהו אלגנטי במיוחד חוץ מאשר לעבור איבר איבר ברשימה החדשה ולעדכן במקום הרלוונטי.

קישור לתוכן
שתף באתרים אחרים

פשוט תשחלף (כלומר תשתמש בפרדיקט שהופך עמודות לשורות ומחזיר את הלוח החדש), תחליף את העמודה (עכשיו היא שורה אז אתה יכול להשתמש במה שכתבת!) ותבצע שוב שחלוף.

לגבי אלכסון... שם תצטרך לעבוד קצת יותר קשה. כרגע אין לי רעיון למשהו אלגנטי במיוחד חוץ מאשר לעבור איבר איבר ברשימה החדשה ולעדכן במקום הרלוונטי.

כל החשיבה הזאת משגעת אותי, ה"לעדכן את הרשימות" כל כך הרבה יותר פשוטות בשפות כמו פסקל...

אבל בפרולוג...זה כל כך סיבוך...צריך להשתמש ברקורסיות

קישור לתוכן
שתף באתרים אחרים

ארכיון

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

×
  • צור חדש...