Bir programın kullanıcıyla ilk selamlaşması çoğu zaman ekrana yazdırdığı küçücük bir metinle başlar. Mantıksal programlama dünyasında, özellikle Prolog gibi dillerde, bu iş “fonksiyon çağırmak”tan çok “yüklem çalıştırmak” şeklinde düşünülür. Yani ekrana metin basmak, değişkenin değerini görmek veya satır atlamak için sisteme gömülü standart yüklemlerden yararlanırız. ``
Prolog’da çıktı işlemlerini anlamak için önce şu fikri netleştirelim: Prolog programı, doğruluğu araştırılan ilişkilerden oluşur. Ancak bazen yalnızca “sonuç doğru mu?” sorusunu değil, “bu sonucu kullanıcıya nasıl gösteririm?” sorusunu da cevaplamak isteriz. İşte write/1, writeln/1, nl/0 ve format/2 gibi yüklemler bu noktada sahneye çıkar.
Teorik olarak çıktı, bir terimin standart çıktı akışına gönderilmesidir. Bunu küçük bir modelle düşünebiliriz:
$Program \rightarrow Standart\ Çıktı \rightarrow Ekran$
Eğer elimizde X = 42 gibi bir değişken bağlaması varsa, write(X) çağrısı artık ekrana 42 değerini taşır. Prolog’da değişkenler başlangıçta bilinmeyen varlıklardır; değerleri birleştirme, yani unification süreciyle belirlenir. Kısaca:
$X = Değer \Rightarrow write(X) = Değerin\ gösterimi$
Aşağıdaki tablo temel çıktı yüklemlerini karşılaştırır:
| Yüklem | Görevi | Yeni satır ekler mi? | Tipik kullanım |
|---|---|---|---|
write/1 |
Terimi ekrana yazar | Hayır | Değişken veya metin göstermek |
writeln/1 |
Terimi yazar ve satır atlar | Evet | Okunabilir listeleme |
nl/0 |
Sadece yeni satıra geçer | Evet | Satır düzeni kurmak |
format/2 |
Şablonlu çıktı üretir | İsteğe bağlı | Raporlama, hizalama |
En basit örnekle başlayalım:
selamla :-
write('Merhaba Prolog!'),
nl,
write('Bugun cikti islemlerini ogreniyoruz.').
Bu kodda selamla/0 adlı bir yüklem tanımlıyoruz. İlk write/1 metni ekrana basar, nl/0 imleci bir alt satıra indirir, ikinci write/1 ise yeni satırdan devam eder. Burada önemli nokta şudur: write/1 yazdırır ama satır sonunu kendiliğinden eklemez. Bu yüzden nl küçük ama kahraman bir yardımcıdır.
Değişken değerlerini göstermek için de aynı mantık geçerlidir:
not_goster(Isim, Not) :-
write(Isim),
write(' isimli ogrencinin notu: '),
write(Not),
nl.
not_goster('Ayse', 95). sorgusu çalıştırıldığında ekranda okunabilir bir cümle oluşur. Burada Prolog, Isim ve Not değişkenlerini çağrı sırasında aldığı değerlere bağlar. Böylece çıktı yalnızca sabit metinden değil, çalışma zamanında gelen bilgilerden oluşur.
Daha düzenli ve profesyonel çıktılar için format/2 oldukça kullanışlıdır. format/2, bir şablon ve bu şablona yerleştirilecek değerler listesiyle çalışır:
rapor(Isim, Puan) :-
format('Ogrenci: ~w~nPuan: ~w~n', [Isim, Puan]).
Buradaki ~w, verilen değeri yazdırır; ~n ise yeni satır anlamına gelir. Yani format/2, write ve nl ikilisini daha kontrollü bir biçimde kullanmamızı sağlar. Özellikle birden fazla değeri aynı çıktıda göstermek istediğimizde kod daha okunur hale gelir.
| Amaç | Daha basit yaklaşım | Daha düzenli yaklaşım |
|---|---|---|
| Tek metin yazmak | write('Selam') |
writeln('Selam') |
| Satır atlamak | nl |
format('~n', []) |
| Değişkenli cümle | Çoklu write/1 |
format/2 |
| Rapor üretmek | Uzun ve parçalı kod | Şablonlu çıktı |
Bir mini örnekle konuyu bağlayalım:
urun_etiketi(Ad, Fiyat, Stok) :-
ToplamDeger is Fiyat * Stok,
format('Urun: ~w~n', [Ad]),
format('Birim fiyat: ~w TL~n', [Fiyat]),
format('Stok: ~w adet~n', [Stok]),
format('Toplam stok degeri: ~w TL~n', [ToplamDeger]).
Bu yüklem, ürün bilgilerini hesaplayıp okunabilir biçimde gösterir. is/2 aritmetik hesaplama yapar; ardından format/2 sonucu ekrana taşır. Matematiksel olarak hesaplanan değer şudur:
$ToplamDeger = Fiyat \times Stok$
Sonuç olarak çıktı işlemleri, programın dış dünyaya açılan penceresidir. write/1 hızlı ve basittir, nl/0 satır düzenini sağlar, writeln/1 pratiklik sunar, format/2 ise ciddi raporların yıldızıdır. Kodunuz doğru çalışabilir; ama iyi biçimlendirilmiş çıktı, kullanıcının “Evet, bu program ne yaptığını biliyor!” demesini sağlar.
Yorumlar