2010-11-25 14 views
6

में मैट्रिक्स को कैसे स्थानांतरित करें I [[1,2,3][4,5,6][6,7,8]] से [[1,4,6],[2,7,8],[3,6,9]] जैसी सूची कैसे स्थानांतरित कर सकता हूं?प्रोलॉग

इसे चित्रित करने के लिए: मैं मैट्रिक्स 90 डिग्री बाईं ओर फ़्लिप करना चाहता हूं। मैं उसे कैसे कर सकता हूँ?

उत्तर

7

सुनिश्चित नहीं हैं कि अपने उदाहरण सही है, लेकिन मैं विचार मिलता है। कोई अगर

1 ?- transpose([[1,2,3],[4,5,6],[6,7,8]], X). 
X = [[1, 4, 6], [2, 5, 7], [3, 6, 8]]. 

अन्यथा (:

SWI-PROLOG का उपयोग कर, तो आप CLPFD module इसलिए की तरह उपयोग कर सकते हैं,:

:- use_module(library(clpfd)).

, आप transpose/2 विधेय का उपयोग करने की अनुमति दे इस तरह एसडब्ल्यूआई-पोलॉग), आप बस इस कार्यान्वयन का उपयोग कर सकते हैं (जो एसडब्ल्यूआई के सीएलपीएफडी में पुराना हो गया था):

transpose([], []). 
transpose([F|Fs], Ts) :- 
    transpose(F, [F|Fs], Ts). 

transpose([], _, []). 
transpose([_|Rs], Ms, [Ts|Tss]) :- 
     lists_firsts_rests(Ms, Ts, Ms1), 
     transpose(Rs, Ms1, Tss). 

lists_firsts_rests([], [], []). 
lists_firsts_rests([[F|Os]|Rest], [F|Fs], [Os|Oss]) :- 
     lists_firsts_rests(Rest, Fs, Oss). 

एक अद्यतन संस्करण के लिए जो फोल्ड और मैपलिस्ट बिल्ट-इन्स का उपयोग करता है, clpfd.pl देखें।

+0

धन्यवाद! मैं एसडब्ल्यूआई प्रोलॉग का उपयोग कर रहा हूं और अपना पहला समाधान करने की कोशिश की। लेकिन जब "use_module (लाइब्रेरी (clpfd) टाइपिंग) टाइप करें।" मुझे निम्न त्रुटि मिलती है: "त्रुटि: स्रोत_सिंक' लाइब्रेरी (clpfd) 'मौजूद नहीं है " क्या आप जानते हैं कि इसे कैसे हल किया जाए? – cody

+0

मुझे लगता है कि या तो आपके पास वास्तव में 'clpfd' लाइब्रेरी नहीं है, या एसडब्ल्यूआई-पीएल की आपकी स्थापना बस्टेड है। 'clpfd.pl' निर्देशिका 'लाइब्रेरी/सीएलपी' (एसडब्ल्यूआई-पीएल होम निर्देशिका के तहत) में रहना चाहिए। यदि यह वहां है, तो शायद एसडब्ल्यूआई-पीएल बस इसे नहीं मिला; इस मामले में, शायद आपके 'pl' निष्पादन योग्य के पास '___। आरसी' कॉन्फ़िगरेशन फ़ाइल का एक अलग नाम है, एसडब्ल्यूआई-पीएल रूट निर्देशिका में भी (वे समान होना चाहिए)। अन्यथा, बस मैंने जो परिभाषा पोस्ट की है, उसका उपयोग करें जो कि 'clpfd' के 'transpose/2' के कार्यान्वयन है। – sharky

+0

ठीक है। पुस्तकालय गायब था और मैंने इसे पुस्तकालय/सीएलपी में कॉपी किया। लेकिन यह अभी भी काम नहीं करता है। मुझे pl-root dir में "plwin.rc" नामक एक फ़ाइल मिली है, और निष्पादन योग्य के साथ एक बिन-फ़ोल्डर है। बिन फ़ोल्डर में .rc को स्थानांतरित करना इसे हल नहीं करता है .. तो क्या मुझे इसे संशोधित करना है? – cody

2

यहाँ a fragment of a larger answer है:

% transposed(+A, ?B) iff matrix B is transposed matrix A 
transposed(A, B) :- transposed(A, [], B). 
transposed(M, X, X) :- empty(M), !. 
transposed(M, A, X) :- columns(M, Hs, Ts), transposed(Ts, [Hs|A], X). 

% empty(+A) iff A is empty list or a list of empty lists 
empty([[]|A]) :- empty(A). 
empty([]). 

% columns(+M, ?Hs, ?Ts) iff Hs is the first column 
% of matrix M and Ts is the rest of matrix M 
columns([[Rh|Rt]|Rs], [Rh|Hs], [Rt|Ts]) :- columns(Rs, Hs, Ts). 
columns([[]], [], []). 
columns([], [], []). 
+0

धन्यवाद :) शायद यह उपयोगी हो सकता है। सबसे पहले मैं ट्रांसपोज़/2 फ़ंक्शन का उपयोग करना पसंद करता हूं, अगर मैं इसे किसी भी तरह काम करने के लिए मिलता हूं ... – cody

0

एक पुनरावृत्ति दृष्टिकोण:

trans([H|R],[H1|R1]):-trans2([H|R],[H|R],[],[H1|R1],0),!. 
trans2([A|_],_,_,[],N):-length(A,N). 
trans2(M,[],H1,[H1|R1],N):-N1 is N+1, trans2(M,M,[],R1,N1). 
trans2(M,[H|R],L,[H1|R1],N):-nth0(N,H,X), 
    append(L,[X],L1),trans2(M,R,L1,[H1|R1],N). 
0

मेरे एक बेहतर समझ के लिए पूर्ण नाम के साथ समाधान:

% emptyMatrix(Line, EmptyMatrix) 
emptyMatrix([],[]). 
emptyMatrix([_|T1],[[]|T2]):-emptyMatrix(T1,T2). 
% only length of parameter 'Line' is interesting. It ignores its content.  

% appendElement(Element, InputList, OutputList) 
appendElement(E,[],[E]). 
appendElement(E,[H|T],[H|L]):-appendElement(E,T,L). 

% appendTransposed(NestedList, InputMatrix, OutputMatrix) 
appendTransposed([],[],[]). 
appendTransposed([X|T1],[],[[X]|T3]):-appendTransposed(T1,[],T3). 
appendTransposed([X|T1],[R|T2],[C|T3]):-appendElement(X,R,C),appendTransposed(T1,T2,T3). 

% transposeMatrix(InputMatrix, TransposedMatrix) 
transposeMatrix([L|M],T):-emptyMatrix(L,A),transpose([L|M],T,A). 
transpose([],T,T). 
transpose([L|M],T,A):-appendTransposed(L,A,B),transpose(M,T,B). 

ए 'लाइन' एक स्तंभ या एक पंक्ति हो सकता है।

विचार खाली मैट्रिक्स की सूचियों में तत्वों को जोड़ने में निहित है। (जैसे सब पहली पंक्ति के तत्वों = सभी कॉलम के पहले तत्व => पहले मैं-वें पंक्ति के सभी तत्वों = सभी कॉलम के आई-वें तत्व)

यह इस सत्र के रूप में मेरे मशीन पर काम करता है प्रोटोकॉल मेरे लिए दिखाता है:

5 ?- transposeMatrix([[1,2],[3,4]],T). 
T = [[1, 3], [2, 4]] ; 
false. 

6 ?- transposeMatrix([[1],[2]],T). 
T = [[1, 2]] ; 
false. 

7 ?- transposeMatrix([[1,2,3],[4,5,6]],T). 
T = [[1, 4], [2, 5], [3, 6]] ; 
false. 

8 ?- transposeMatrix([[1]],T). 
T = [[1]] ; 
false. 
0

सरल तरीका:

trans(M, [P|T]):- first(M, P, A), trans(A, T). 
trans(Empty, []):- empty(Empty). 

empty([[]|T]):- empty(T). 
empty([[]]). 

first([[P|A]|R], [P|Ps], [A|As]):- first(R, Ps, As). 
first([], [], []). 

कुशल भी

[debug] 36 ?- time(trans([[1,2,3],[4,5,6],[7,8,9]],A)). 
% 21 inferences, 0.000 CPU in 0.000 seconds (?% CPU, Infinite Lips) 
A = [[1,4,7],[2,5,8],[3,6,9]] ; 
% 12 inferences, 0.000 CPU in 0.000 seconds (?% CPU, Infinite Lips) 
false. 
+1

सरल मामलों को अंतिम रखने का कोई कारण आखिरी है? – false

+0

मैं परिणामों का ऑर्डर नहीं कर सकता। –

2

यह सबसे छोटा जवाब है जिसके साथ मैं आ सकता हूं। हालांकि पूंछ रिकर्सन को सक्षम करने के लिए अंतर सूची का उपयोग करके इसे बेहतर किया जा सकता है।

transpose([[]|_], []). 
transpose(M, [X|T]) :- row(M, X, M1), 
         transpose(M1, T). 
row([], [], []). 
row([[X|Xs]|Ys], [X|R], [Xs|Z]) :- row(Ys, R, Z). 
0

एक और दृष्टिकोण:

delete_one_list([], []). 
delete_one_list([[_|L]|LLs], [L|Ls]) :- 
    delete_one_list(LLs, Ls). 

transpose_helper([], []). 
transpose_helper([[X|_]|Xs], [X|Ys]) :- 
    transpose_helper(Xs, Ys). 

transpose([[]|_], []). 
transpose(List, [L|Ls]) :- 
    transpose_helper(List, L), 
    delete_one_list(List, NewList), 
    transpose(NewList, Ls). 
संबंधित मुद्दे