Yasal olarak sınırsız sonuçların tüm öğelerini sıralayabilecek herhangi bir prolog uygulaması var mı?Prolog: Adsız Sonsuz Sonuçların Tüm Unsurlarını Numaralandırın
Tüm doğal sayı çiftlerini numaralandırmayı düşünelim. Eğer çiftleri {(0,0), (0,1), (1,0), (0,2), (1,1), (2,0), ...} sıralarına göre numaralandırırsak tüm çiftleri sıralayabilir. Bununla birlikte, eğer aşağıdaki GNU prolog programı olarak {(0,0), (0,1), (0,2), (0,3) ...} sıralarıyla çiftleri sayıyorsak, (1,1).
% cat nats.pl
nat(0).
nat(X1) :- nat(X), X1 is X + 1.
pair_of_nats(X, Y) :- nat(X), nat(Y).
% prolog
GNU Prolog 1.3.0
By Daniel Diaz
Copyright (C) 1999-2007 Daniel Diaz
| ?- ['nats.pl'].
compiling /home/egi/prolog/nats.pl for byte code...
/home/egi/prolog/nats.pl compiled, 4 lines read - 762 bytes written, 9 ms
yes
| ?- pair_of_nats(X,Y).
X = 0
Y = 0 ? ;
X = 0
Y = 1 ? ;
X = 0
Y = 2 ? ;
X = 0
Y = 3 ?
Teşekkürler! Arama algoritmasını derinlik-ilk aramadan ilk ilk aramaya kadar yapılandırabileceğimiz herhangi bir uygulama var mı? Bence, bazı durumlarda, ilk arama, yararlıdır ve derinlemesine ilk arama için programı yeniden yazma programı dağınık hale getirir. – egi
Varsayılan stratejinin önce derinlik olmasının iyi nedenleri vardır. Ardından gelen çözümler, herhangi bir önemsiz sıraya göre sıralanmamıştır, bu nedenle programınızda, tam olarak neyin peşinde olduğunuzu açıklamanız beklenir. –
Şimdiye kadar sunulan cevaplar doğal sayı çiftleri oluşturmak için güzel, ama sanıyorum daha genel sorun, Prolog'un arama stratejisi tarafından vurgulandığı gibi @Boris tarafından vurgulanacaktır.Eğer iki (ya da daha fazla) keyfi yükleminiz varsa, p1 've' p2 ', her biri bir tür sonsuz sayıda çözüm üretiyorsa, Prolog'un çözümlerini ilk bakışta, kendi aralarında çözümlerini keşfetmesi için bir yol olduğundan emin değilim. Doğal sayılar (* örn. *, 'p1 (N, ...)', 'p2 (N, ...)' ile açık bir ilişkiye sahip olmadıkça, doğal sayı metodu kısıtlamak için kullanılabilir. backtracking sonuçları. – lurker