2010-07-24 25 views
25

Benim SWI-Prolog bilgi tabanım aşağıdaki iki gerçeği içerir: Bu prolog sorgusu neden hem doğru hem de yanlış?

f(a,b). 
f(a,c). 

Şimdi

?- f(a,c). 
true. 

xzxx xzxx xzxx xzxx xzxx xzxx xzxx xzxx xzxx xzxx doğru ve yanlış? Bu, KB'de üç gerçek olduğunda da gerçekleşir. Eğer f (a, d) eklerseniz. KB'ye, sonra f (a, d) doğrudur (sadece), ancak f (a, b) ve f (a, c) hem doğru hem de yanlıştır. Neler oluyor ve Prolog'un bu sorgular için doğru cevap verdiğini ne yapabilirim?

+3

Kahretsin, iyi bir soru: Eğer ilk başarılı hit sonra cevap arıyor durdurmak için Prolog anlatmak istiyorum, o zaman kesim (!) kullanın. –

cevap

24

: Prolog f(a,c) doğru olup olmadığını belirler nasıl

düşünün (Not bu cevabı biraz bir tahmin taşımaktadır). İlk kuralı f(a,b) denetler ve bir eşleşme bulamaz, ancak ikinci kural f(a,c) eşleşir. Bu nedenle, f(a,c) doğrudur. Ayrıca, f için daha fazla kural olmadığından, bir geri izlemenin gerçekleşmesine izin vermenin bir anlamı yoktur - başka olası çözüm yoktur.

Şimdi f(a,b)'u düşünün. Prolog ilk kuralı kontrol edecek ve bir eşleşme bulacak. Bu nedenle, f(a,b) doğrudur. Ancak, tüm kurallar tükenmiş değil. Bu nedenle, Prolog aramanın devam etmesine izin verir (;'a isabet ettiyseniz). Aramaya ve geri aramaya devam ettiğinizde, kalan kuralların, özellikle f(a,c), f(a,b) ile eşleşmediğini keşfedecektir. Bu nedenle sonuç yanlıştır.

+11

Bu cevap doğru. Prolog'da, gerçeklerinizin kurallarının yazıldığı sıra, bir sorgu tarafından bulunacakları sırayı belirler. Daha spesifik olarak, 'backtrack' seçeneği ";" temelde sorgu motorunu döndürülen sonucu atmaya zorlar ve “başka * cevaplar var mı?” sorusunu yanıtlar. Yani, f (a, b) 'nin hem doğru hem de yanlış olmadığı; bunun yerine doğru olduğu ve bu sonucu göz ardı etmeyi seçerseniz, motor size başka bir f (a, b) olgu girişi olmadığını söyleyecektir. Bunu kanıtlamak için ikinci bir f (a, b) gerçeği eklerseniz ne olacağını izleyin. – Assaf

+4

Bu ayrıca performanstan endişe duyuyorsanız neden argümanlarınızın sırasına dikkat etmeniz gerektiğini gösterir. Eğer 'f' yüklemindeki argümanların sırası tersine çevrilirse, bu, ilk argümanların artık aynı olmadığı ve bunun için bir seçim noktası bırakmadığı için olmazdı. Bunun nedeni çoğu prolog'un argüman endekslemesini gerçekleştirmesidir, bu da, önceden arama alanıyla ilgili olarak budanmış olan uyumsuz argümanlarla yapılan yüklemlere izin verir. SWI Prolog sadece ilk argümanı varsayılan olarak endeksler, ancak bu değiştirilebilir. – nedned

11

Sadece Michael Williamson'un cevabına ek olarak.

?- f(a, b), !. 
true. 

?- f(a, c), !. 
true. 
İlgili konular