Tilki, Kaz ve Mısır Çuvalı Çözümü (Adım Adım, Resimli)
Konuşacağımız ilk klasik problem, beraberindeki nesneleri nehrin karşısına taşıması gereken bir çiftçiyle ilgili bir bulmaca. Bu çiftçinin bir tilkiyi, bir kazı ve bir mısır çuvalını nehrin karşısına geçirmesi gerekmektedir. Çiftçinin bu işlemi gerçekleştirmek için küçük bir teknesi var ancak bu teknede çiftçi ile birlikte en fazla bir nesneye daha yer var. Ne yazık ki tilki ve kaz açtır. Bu yüzden tilki kaz ile yalnız kalamaz çünkü tilki kazı yiyebilir. Aynı şekilde kaz ve mısır çuvalı yalnız bırakılamaz çünkü kaz mısırı yiyebilir.
Bu koşullarda çiftçi nehrin karşısına tilki, kaz ve mısırı sorunsuz bir şekilde nasıl geçirebilir?
Bu soruna daha önce hiç rastlamadıysanız burada durun ve çözmek için birkaç dakika harcayın. Bu bilmeceyi daha önce duyduysanız ve çözdüyseniz nasıl çözüm bulduğunuzu hatırlamaya çalışın.
Tekne ile aynı anda en fazla iki nesne taşınabildiğini biliyoruz. Tilki ve kaz aynı kıyıda yalnız bırakılamayacağı gibi kaz da mısır çuvalıyla aynı kıyıda yalnız bırakılamaz.
Bu bilmeceyi bir ipucu olmadan çözmekte zorlanabiliriz. İşte mantık yürütme biçimi. Çiftçi her seferinde nesnelerden birini alabileceğinden çiftçinin her şeyi kıyıya götürmek için birden fazla gidip gelmesi gerekecektir. İlk gidiş sırasında çiftçi tilkiyi alırsa kaz, mısır çuvalıyla yalnız kalır ve kaz mısırı yiyebilir. Aynı şekilde çiftçi ilk gidiş sırasında mısır çuvalını alacak olursa tilki kaz ile yalnız kalacak ve tilki kazı yiyecektir. Bu nedenle çiftçi, Şekilde gösterilen çözümde sunulduğu gibi ilk turda kazı almalıdır. Bununla birlikte bu adımdan sonraki tüm adımlar başarısızlığa uğramış gibi görünüyor.
Kazın uzakta olması son derece iyi bir çözümdür. Ancak ikinci turda, çiftçi tilki ya da mısırı almalıdır. Bununla birlikte çiftçi neyi alıyor olursa olsun geri kalanlar için yakın kıyıya dönerken kaz uzak kıyıda kalmalıdır. Bu, tilkinin ve kazın birlikte bırakılacağı ya da kaz ve mısır çuvalını birlikte bırakılacağı anlamına gelir. Bu durumlardan hiçbiri kabul edilemez çünkü bu durumda problem çözülemez.
Daha önce bu sorunu gördüyseniz muhtemelen çözümün kilit unsurunu hatırlarsınız. Çiftçi daha önce açıklandığı gibi ilk turda kazı almak zorundadır. İkinci turda, çiftçinin tilkiyi aldığını varsayalım. Bununla birlikte tilkiyi kaz ile bırakmak yerine çiftçi kazı yanına alarak yakın kıyıya geri götürür. Tilki uzak kıyıda yalnız kalır. Sonra çiftçi dördüncü turda tilkiyi yakın kıyıda yalnız bırakarak mısır çuvalını uzak kıyıya götürür. Çözüm süreci Şekilde gösterilmektedir.
Pek çok kişi yakın veya uzak kıyıdan birini geri almayı düşünmez çünkü bu bulmaca zordur. Bazı insanlar, sorunun haksız olduğunu önererek “Geri alabileceğimi söylememiştiniz.” şeklinde tepki verebilir. Oysaki problem ifadesinde aksi yönde bir açıklama bulunmamaktadır.
Ögelerden birini yakın kıyıya geri götürme imkânı açıkça belirtilseydi bulmacanın ne kadar kolay çözüleceğini düşünün. O zaman problemin çözümüne ulaşmak için düşünmemize gerek bile kalmayacaktır. Bu yüzden farklı biçimde düşünebilen ve farklı çözüm yolları üretebilen kişiler bu problemi çözecektir. Bu, problem çözmede önemli bir ilkeyi göstermektedir: Yapabileceğiniz olası tüm hareketleri öngöremezseniz sorunu çözemezsiniz. Diğer yandan olası tüm işlemleri numaralandırarak, çalışan birleşimini bulana kadar farklı işlemleri deneyerek birçok problemi çözebilirsiniz. Genel olarak bir sorunu daha biçimsel adımlarla yeniden düzenleyerek elinizden kaçırdığınız çözümleri ortaya çıkarabilirsiniz.
Artık çözümü bildiğimize göre problemi daha biçimsel ifade etmeyi deneyebiliriz. Öncelikle kısıtlamaları listeleyeceğiz. Buradaki anahtar kısıtlamalar şunlardır:
- Çiftçi tekne içerisine tek seferde kendisi dışında yalnızca bir nesne daha alabilir.
- Tilki ve kaz aynı kıyıda yalnız bırakılamaz.
- Kaz ve mısır aynı kıyıda yalnız bırakılamaz.
Bu problem, kısıtlamaların önemini ortaya koyan iyi bir örnektir. Bu kısıtlamalardan herhangi birini kaldırırsak bulmaca kolay hâle gelir. İlk kısıtlamayı kaldırırsak üç ögeyi tek bir turda alabiliriz. Tekneye sadece iki öge alsak bile tilki ve mısır çuvalını alıp kaz için geri dönebiliriz. İkinci kısıtlamayı kaldırırsak (ancak diğer kısıtlamaları yerinde bırakırsak) önce kaz, sonra tilki ve sonunda mısırı alabiliriz. Kaz ve mısırda dikkatli olmamız gerekir. Bu nedenle kısıtlamaların herhangi birini unutursak veya yok sayarsak problemi doğru bir şekilde çözemeyiz.
Sonra, işlemleri listeleyelim. Bu bulmacanın işlemlerini belirlemenin çeşitli yolları vardır. Yapabileceğimizi düşündüğümüz eylemlerin belirli bir listesini hazırlayabiliriz:
- İşlem: Tilkiyi nehrin karşı tarafına taşıyın.
- İşlem: Kazı nehrin karşı tarafına taşıyın.
- İşlem: Mısır çuvalını nehrin karşı tarafına taşıyın.
Ancak, sorunu biçimsel olarak yeniden ifade etme amacının çözüm için bir fikir edinmek olduğunu unutmayın. Eğer problemi çözemediyseniz ve diğer gizli işlemleri keşfedemiyseniz eylem listesi oluştururken de problemi çözemeyiz demektir. Bunun yerine işlemleri kapsamlı (biçimsel) yapmalı ve koşullu hâle getirmeliyiz.
- İşlem: Tekneyi bir kıyıdan diğerine götürün.
- İşlem: Teknede yalnızca çiftçi varsa (sadece bir nesne) tekneye kıyıdan bir nesne yükleyin.
- İşlem: Teknede iki nesne varsa (çiftçi ve bir nesne daha) nesneyi kıyıya bırakın.
Bu ikinci işlem listesi; problem hakkında en biçimsel anlamda düşünmemizi, koşullara uygun biçimde problemi çözmemizi, kaz ile yakın kıyıya geri yolculuğu düşünmemizi sağlayacaktır. Olası tüm hareket dizilerini üretirsek her bir diziyi kısıtlamalardan birini ihlal ederek veya daha önce gördüğümüz bir yapılandırmaya ulaşarak bitirirsek sonunda Şekildeki diziye ulaşıp bulmacayı çözeriz. Bulmacanın doğasında olan zorluk, kısıtlamaların ve işlemlerin düzgün olarak tekrar konması yoluyla engellenecektir. Böylece bu problemi 7 adımda çözdüğümüzü görürüz.
- İşlem: Kazı nehrin karşı tarafına taşıyın.
- İşlem: Tekneyi bir kıyıdan diğerine götürün.
- İşlem: Tilkiyi nehrin karşı tarafına taşıyın.
- İşlem: Kazı nehrin karşı tarafına taşıyın.
- İşlem: Mısır çuvalını nehrin karşı tarafına taşıyın.
- İşlem: Tekneyi bir kıyıdan diğerine götürün.
- İşlem: Kazı nehrin karşı tarafına taşıyın.
Bu Problemden Neler Öğrendik?
Sorunu daha biçimsel bir şekilde yeniden ifade etmek, bir problemi anlamak için mükemmel bir tekniktir. Birçok programcı, diğer programcıları bir sorunu tartışmak için arar; sadece diğer programcıların yanıtı olabileceğini düşünür fakat aynı zamanda problemi yüksek sesle ifade etmek genellikle yeni ve yararlı düşünceleri tetikler. Bir sorunun tekrar okunması, bu tartışmayı başka bir programcıya yaptırmak gibidir ancak her iki noktadan da destek alırsınız.
Daha kapsamlı ders ise sorunun düşünülmesi, çözümü düşünmek kadar üretken olabileceği gibi bazı durumlarda daha üretken olabileceğidir. Çoğu durumda, çözüme doğru yaklaşım biçimi olabilir.