2015-12-08 30 views
5

Bir matrisin n-th sırasını döndürüryüklemini yazmaya çalışıyorum; bu, bir matrisin n n elemanını (bu durumda satır) döndürür. Örnek:Prolog -

?- rowN([[1,2],[3,4],[5,6]], 2, R). 
R = [3,4]; 
No 

tezgahın ile mücadele ediyorum. Bazı oldukça benzer örnekler bulmak için başarısız bir şekilde denedim. Şimdiye kadar bunu yazmam başardınız:

Kodu:

rowN(L,[],[]). 
rowN([],X,[]). 
rowN([],[],[]. 
rowN([H|T],X,R) :- 
    A==X, 
    A is A + 1, 
    rowI(T,A,H). 

cevap

4

Bu çizgi çok mantıklı değil: Eğer doğru anlamak İkinci argüman bir tamsayı (çünkü

rowN(L,[],[]). 

) ve bir liste kullanın. Hemen hemen tüm argümanlarınız budur. Ayrıca, RowI'u özyinelemeli aramanızda mı kullanıyorsunuz?

Çözüm

bir çözüm ilk ilk satırı (I = 1), matrisin kafasına eşit olduğunu belirtmektir:

rowN([H|_],1,H). 

yanındaki numaralandırmak iteratif yol bulmalıyız matrisin. Yani başlık kesinlikle formun bir şeydir:

rowN([H|T],I,X) :- 
# ... 

Şimdi I 1 eşit olmadığını üstlenecek (daha sonra bu konuyu tartışacağız). Bu durumda daha ileri matrisi hareket etmesi gerekli, bu yüzden kuyruk almak ve sayaç I bir geri ayarlayacaktır. Bu kullanılarak yapılabilir:

rowN([_|T],I,X) :- 
    I1 is I-1, 
    rowN(T,I1,X). 

Yani bizim yüklem okur:

rowN([H|_],1,H). 
rowN([_|T],I,X) :- 
    I1 is I-1, 
    rowN(T,I1,X). 

Şimdi bu yüklemi, eğer doğru sonucu verecektir:

?- rowN([[1,2],[3,4],[5,6]], 2, R). 
R = [3, 4] ; 
false. 

soru neden olduğu yüklemenin diğer sonuçlar oluşturmaz: ilk sonucu gösterdikten sonra, rowN([[1,2],[3,4],[5,6]], 2, R) :- rowN([[3,4],[5,6]],1,[3,4]). için alternatifleri bulmaya çalışabilir. İkinci cümleyi kullanarak bunu yapar, ancak daha sonra satırlar tükenir ve rowN([],_,_) yüklemi için çağrılır, çünkü eşleşme eşleşmesi başarısız olur.

Bu çözüm mükemmel değildir: Prolog'da genel olarak doğru olan tüm yönlerde düzgün çalışmaz. Bu yüzden iyi Prolog programcıları kütüphaneler yazdı. Bunun yerine tekerleği yeniden keşfetmek nth1/3

yerleşik 's kullanma

, sen deney hayvanlarının-prolog içinde nth1/3 yüklem yararlanabilirler. Eğer nth1(2,[[1,2],[3,4],[5,6]],R). gibi demen gerekiyor - - argümanlar takas rağmen o insanların çoğu bir hızlı çözeltide gelebilir daha ne yönde çalışır avantajı vardır o milyarlarca test edilmiştir, bunun nedeni (yakın kesinlik bugfree ile yüklemeyi kullanan tüm Prolog programlarının zamanları) ve bu yerleşiklerin bazıları C++ uygulamasında bazen daha hızlı hale getirilir.Örneğin: Böylece ikinci sıra ne olduğunu sorabilir

?- nth1(2, [[1,2],[3,4],[5,6]], R). 
R = [3, 4]. 

?- nth1(I, [[1,2],[3,4],[5,6]], [5,6]). 
I = 3. 

?- nth1(I, [[1,2],[3,4],[5,6]], R). 
I = 1, 
R = [1, 2] ; 
I = 2, 
R = [3, 4] ; 
I = 3, 
R = [5, 6]. 

?- nth1(I,M,[2,3]). 
I = 1, 
M = [[2, 3]|_G23] ; 
I = 2, 
M = [_G22, [2, 3]|_G26] ; 
I = 3, 
M = [_G22, _G25, [2, 3]|_G29] ; 
I = 4, 
M = [_G22, _G25, _G28, [2, 3]|_G32] . 

, endeks I ait küpe ve sıranın R ile cevaplayarak sorgu daha genel hale nereye satır [5,6] bulunduğu sormak ve bir matris oluşturmak Bir satır [2,3] bir yere.

+2

Bu cevap çok anlayışlıydı! Teşekkürler @CommuSoft –