امیر یک سوال جالب پرسیده: آیا تو مریخ به زمین میگن مریخ؟ اجازه بدید با پرولوگ حلش کنیم!
برای شروع باید دید که سوالمون دقیقا چی هست، که روابط لازمه رو براش تعریف کنیم. میشه برای راحتی سوال رو به این صورت نوشت:
آیا کسایی که تو مریخ زندگی میکنن، زمین رو مریخ صدا میکنن؟
که تبدیل به این سوال پرولوگ میشه:
lives(A, mars), calls(A, X, mars), named(X, earth).
در از پرولوگ میخوایم برامون یک فرد A پیدا کنه که توی مریخ زندگی میکنه، به شی X میگه مریخ و اون شی اسمش زمین باشه.
رابطه اسم داشتن که خیلی ساده است، اول مدعی میشیم که هر چیزی اسمش همونه:
named(X, X).
و تمام. برای این که به عمد صورت سوال رو خراب نکنیم فرض میکنیم که این رابطه فقط توی زمین برقراره، پس اسمشو عوض میکنیم تا بشه namedE
namedE(X, X).
حالا باید رابطه صدا کردن رو تعریف کنیم. اولش گفتیم که تابع namedE برای زمینیهاست، پس میتونیم بگیم که...
calls(A, X, Y) :- lives(A, earth), namedE(X, Y).
به عبارت دیگه اگه فرد A در زمین زندگی کنه، و ما رابطه namedE بین X و Y داشته باشیم (= زمینیها X رو Y صدا کنن) اونوقت نتیجه میگیریم که A هم X رو Y صدا میکنه. یه نکته جالب دیگه هم میدونیم ما، اونم اینه که هر فردی یا تو زمین زندگی میکنه یا تو ایستگاه بینالمللی فضایی، بنابراین:
lives(A, earth) :- not(lives(A, iss)).
همچنین ما میدونیم که در لحظه پرسیده شدن این نوشته ده نفر در ایستگاه فضایی بودن:
lives(anton_shkaplerov, iss).
lives(mark_vande_hei, iss).
lives(pyotr_dubrov, iss).
lives(kayla_barron, iss).
lives(matthias_maurer, iss).
lives(thomas_marshburn, iss).
lives(raja_chari, iss).
lives(ye_guangfu, iss).
lives(wang_yaping, iss).
lives(zhai_zhigang, iss).
به نظر میرسه همه چیز آماده است. کافیه فایل رو لود کنیم و از پرولوگ سوال بپرسیم!
?- [marse].
true.
?- lives(A, mars), calls(A, X, mars), namedE(X, earth).
false.
پس نه. تو مریخ به زمین نمیگن مریخ.