2016-03-19 22 views
0

Kısa bir süre önce Prolog'u öğrenmeye başladım ve bir sorunla karşılaştım.Sorgu döndürme doğru/yanlış

şu Prolog içine yüklenmiş:

likes(john, apple). 
likes(john, pear). 
likes(john, grapes). 
likes(bill, mango). 
likes(bill, apple). 

Ben True dönmelidir bir yüklemi all_like(What, List) yazıyorum eğer What meyve gibi List tüm insanlar.

Örn:

all_like(apple,[john, bill]). 

dönmelidir:

true ; 
false. 

all_like(grapes,[john, bill]).

dönmelidir: Aşağıdaki kod var

false. 

:

all_like(What,List) :- check_list(What,List). 

check_list(What,[]) :- write('true'). 
check_list(What, [X|Rest]) :- likes(X,What), check_list(What,Rest). 
check_list(What, [X|Rest]) :- \+ likes(X,What), write('false'). 

Benim sonuçları şunlardır:

1 Sorgu

true 
true . 

Ben bu sonuçları alıyorum neden

false 
true . 

herkes bilir mi 2 Sorgu?

Çıkarılan ikinci boolean değerinin önemi nedir?

Son olarak, önemli bir alandan sonra görünen . mu?

Yardımlarınız için teşekkür ederiz.

cevap

2

Prolog zaten yüklem (true veya yes) başarılı veya (a) açıkça başarısı üzerine "true" yazmak ne zaman yüklemi çok iş yapıyoruz, böylece (false veya no) başarısız ve olmadığını gösterir (b) bir başarısızlık durumunda başarılı olmaya çalışın ve başarısızlık yazın. Başarısız durumun başarısız olmasına izin vermek en iyisidir, o zaman Prolog başarısızlığı gösterecektir.

Bir kenara göre, check_list yüklemeniz gereksizdir ve yalnızca all_likes'u kullanabilirsiniz.

SWI Prolog'da
all_likes(_, []).    % An empty list likes anything 
all_likes(What, [X|Rest]) :- % All of [X|Rest] likes What if... 
    likes(X, What),   % X likes What and... 
    all_likes(What, Rest). % All of Rest likes What 

şu sonuçları görürsünüz: Yani bu tek ihtiyacınız gerçekten

| ?- all_likes(apple,[john, bill]). 

true ? ; 

no 
| ?- all_likes(grapes,[john, bill]). 

no 
| ?- 
+0

Teşekkür: GNU Prolog'da

?- all_likes(apple,[john, bill]). true ; false. ?- all_likes(grapes,[john, bill]). false. 

, çıktı şuna benzer lurker, bu daha mantıklı. İlk örnekte 'true' ifadesinden sonra 'false' yazıldığını sorabilir miyim? –

+2

@Giri "false", "true" ifadesinden sonra görüntüleniyor, çünkü Prolog'un daha fazla çözüm olup olmadığını kontrol etmek için bir seçim noktası vardı, ancak ek yanıtlar bulamadı. Yani SWI Prolog "false" çıkarır. GNU Prolog örneğinde görebilirsiniz, "yanlış" yerine "hayır" alırsınız ve aynı şey anlamına gelir: daha fazla çözüm yok. – lurker

İlgili konular