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 swi-prolog '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.
Bu cevap çok anlayışlıydı! Teşekkürler @CommuSoft –