Sorgularda gereksiz hedeflerin kullanımı


12

(Upon @repeat önerisi bir bir sorgu düşünün) saf programı 1 ?- G_0. sorgu ne işe yarar varsa olur ?- G_0, G_0.var?

Dipnotlar
1 Sekme yok (güvenli olmak için), kısıtlamalar TAMAM. Konuyla ilgili
önceki yazı .


Sonuçların karesini alma?
Willem Van Onsem

1
Hedefin ard arda yürütülmesinden hiçbir devlet bilgisinin korunmadığını düşünüyorum. Başka bir deyişle, sorunun bir varyasyonuna izin verilmez, örn. ?- G_0(State), G_0(State).Ayrıca, ilk hedefin sonucundan ikinci hedefe kadar yığın üzerinde herhangi bir durum geçirilmez mi?
Guy Coder

1
G_0diyelim kiG_0 = append(Xs,Ys,Zs)
yanlış

1
@GuyCoder: bağlaç gereklidir. ( G_0;G_0Biri ile yan etkileri veya performans / önbellekleme / tablolama sorunları test edilebilir)
yanlış

1
BTW, yerine bir G_0(State),G_0(State)tane yazıyorcall(G_1,State), call(G_1,State)
yanlış

Yanıtlar:


3

Sorgu ?- G_0, G_0.,?- G_0.

Bunun cevapların sayısını karşılaştırmak için yeterli Bunu yapmak için ?- G_0.bir cevap sayısı ile ?- G_0, G_0.. Bu cevapları depolamaya gerek yok (bu sık sık bir hata kaynağıdır). Sadece iki tamsayı yeter! Eşitlerse, artıklık yoktur. Ancak ?- G_0, G_0.daha fazla cevabı varsa, fazlalık vardır. İşte bir örnek:

p(f(_,a)).
p(f(b,_)).

?- p(X).
   X = f(_A, a)
;  X = f(b, _A).  % two answers

?- p(X), p(X).
   X = f(_A, a) 
;  X = f(b, a)
;  X = f(b, a)
;  X = f(b, _A).   % four answers
                   % thus p(X) contains redundancies

... ve şimdi bunu düzeltelim:

p(f(B,a)) :-
   dif(B, b).
p(f(b,_)).

?- p(X).
   X = f(_A, a), dif(_A, b)
;  X = f(b, _A).

?- p(X), p(X).
   X = f(_A, a), dif(_A, b), dif(_A, b).
;  X = f(b, _A).    % again two answers, thus no redundancy

İlgili kısıtlamaları manuel olarak incelemeye gerek yoktur.

Bu, yalnızca gereksiz yanıtları açıkça aradığımızda daha da genişletilebilir call_nth/2.

?- G_0, call_nth(G_0, 2).

1

Saf bir program1? - G_0 sorgusunu düşünün. Sorgu varsa ne kullanır? - G_0, G_0. Sahip olmak?

Özellikle kuyruk özyineleme optimizasyonu ( son çağrı optimizasyonu ) AÇIK olduğunda ikinci hedefin hiçbir faydası görmüyorum .

Sorgu kaynakları açgözlü ve yukarıdaki seçenekler KAPALI (örneğin hata ayıklama) olduğunda bir GC sorunu (yığın / yığın taşması) fark edebilir .

Sanırım ikinci çağrı gereksiz (saf program için) ve derleyici tarafından ortadan kaldırılmalıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.