मेरे पास एक प्रक्रियात्मक ईडीएसएल है जो बयानों के ब्लॉक का उपयोग करता है।हास्केल में आंशिक क्रम का उपयोग करके सूची को कैसे क्रमबद्ध करें?
ये बयान किसी विशेष क्रम में ब्लॉक में जोड़े गए हैं हालांकि बयान के बीच निर्भरता हो सकती है।
ईडीएसएल के संकलन के दौरान, मुझे यह सुनिश्चित करना होगा कि निर्भरता के क्रम में बयान का आदेश दिया गया हो, उदा।
B := A
C := B
E := D
के बाद से नहीं सभी बयानों निर्भरता है वहाँ कोई कुल आदेश है (जैसे E := D
ऊपर स्वतंत्र है और कहीं भी रखा जा सकता है)। कोई चक्रीय निर्भरता नहीं है इसलिए सूची क्रम संभव होना चाहिए।
मैं Data.List.sortBy
का उपयोग करने और Ordering
जो EQ
वापसी होगी मतलब है कि बयान कोई निर्भरता है परिभाषित करने के लिए एक समाधान को हैक करने की कोशिश की है। यह कुछ उदाहरणों के लिए काम करता था लेकिन सामान्य मामले में नहीं, उदाहरण के लिए निम्नलिखित आदेश देने कुछ नहीं किया:
C := B B := A
D := C = should produce => C := B
B := A D := C
इसका कारण यह है डिफ़ॉल्ट सॉर्ट प्रविष्टि प्रकार और केवल यकीन डाला आइटम छोटे या अगले के बराबर है बनाता है।
मैं एक Poset कार्यान्वयन के लिए इन्टरनेट की खोज की है, लेकिन कुछ भी लागू नहीं पाया है:
altfloat:Data.Poset को परिभाषित करता है Ordering = LT | GT | EQ | NC
(गैर तुलनीय के लिए NC
) जो अच्छा है, लेकिन उपलब्ध कराई गई sort
मान लिया गया NaN
तरह गैर तुलनीय वस्तुओं और बस उन्हें दूर फेंकता है।
logfloat:Data.Number.PartialOrd उपरोक्त के समान है Maybe Ordering
को छोड़कर और मुझे पैकेज में कहीं भी सॉर्टिंग फ़ंक्शन दिखाई नहीं देता।
Math.Combinatorics.Poset मुझे यह पता नहीं लगाया गया है कि इसका उपयोग कैसे किया जाए या यह लागू हो।
नीचे एक न्यूनतम उदाहरण है जिसमें दोनों बाध्यकारी और गैर बाध्यकारी बयान हैं। गैर-बिनडिंग स्टेटमेंट का आदेश मायने रखता है और उन्हें मूल ऑर्डर को बनाए रखना चाहिए (यानी सॉर्टिंग स्थिर w.r.t. स्टेटमेंट्स होना चाहिए जिन पर निर्भरता संबंध नहीं है)।
मुझे आशा है कि वहाँ एक पूर्ण विकसित निर्भरता ग्राफ का उपयोग किए बिना यह करने के लिए एक सरल उपाय है ...
module Stmts where
import Data.List (sortBy)
data Var = A | B | C | D | E | F | G | H deriving (Eq, Show)
data Stmt = Var := Var
| Inc Var
deriving (Show)
-- LHS variable
binds :: Stmt -> Maybe Var
binds (v := _) = Just v
binds _ = Nothing
-- RHS variables
references :: Stmt -> [Var]
references (_ := v) = [v]
references (Inc v) = [v]
order :: [Stmt] -> [Stmt]
order = sortBy orderStmts
orderStmts :: Stmt -> Stmt -> Ordering
orderStmts s1 s2 = ord mbv1 mbv2
where
ord Nothing Nothing = EQ -- No dep since they don't bind vars
ord (Just v1) Nothing = LT -- Binding statements have precedence
ord Nothing (Just v2) = GT -- ^^^
ord (Just v1) (Just v2) -- Both statements are binding:
| v1 `elem` refs2 = LT -- * s2 depends on s1
| v2 `elem` refs1 = GT -- * s1 depends on s2
| otherwise = EQ -- * neither
-- *Maybe* they bind variables
mbv1 = binds s1
mbv2 = binds s2
-- Variables they reference
refs1 = references s1
refs2 = references s2
-- The following should return [B := A, C := B, D := C, Inc F, Inc G]
test = order [Inc F, Inc G, C := B, D := C, B := A]
बिल्कुल स्पष्ट होने के लिए: आप एक _stable sort_ की तलाश में हैं जो आदेश को अतुलनीय तत्वों के लिए अपरिवर्तित छोड़ देता है? – MathematicalOrchid
मैंने थोड़ी सी खोज की और पाया [यह पिछला SO सवाल] (http://stackoverflow.com/questions/11230881/stable-topological-sort)। मुझे वेब पर टिप्पणियां भी मिलीं कि क्या "स्थिर स्थलीय प्रकार" (जो यह अस्तित्व में होगा) एक अच्छी तरह से परिभाषित चीज है। निश्चित रूप से [टोपोलॉजिकल सॉर्टिंग पर विकिपीडिया का आलेख] (https://en.wikipedia.org/wiki/Topological_sorting) में कहीं भी "स्थिर" शब्द नहीं है। उस नस में मेरा अपना प्रश्न: क्या यह वास्तव में * संभव * अतुलनीय शर्तों का क्रम रखने के लिए है? –
एचएम मुझे लगता है कि अगर बयानों को केवल स्थिर होने की आवश्यकता है यदि उनके पास अन्य बयानों के साथ * कोई * निर्भरता संबंध नहीं है, तो कोई समस्या नहीं है। सामान्य स्थिर स्थलीय सॉर्टिंग की मजबूत समस्या के लिए मुझे एक काउंटररेक्स नमूना मिला: ए> सी, बी> डी, ई <सी, एफ <डी। के साथ नोड्स एबीसीडीईएफ और फिर ए और ई का बी और एफ से कोई संबंध नहीं है, लेकिन यदि सी सॉर्ट किया गया है डी से पहले बी को ई के साथ ऑर्डर स्विच करना होगा, और यदि डी को सी से पहले क्रमबद्ध किया गया है तो ए को एफ –