2012-08-16 20 views
6

Alloy 4 grammarprivate कीवर्ड ले जाने के लिए हस्ताक्षर घोषणाओं (और कुछ अन्य चीजों) की अनुमति देता है। यह भी विनिर्देशों रूपमिश्र धातु में 'निजी' कीवर्ड का अर्थ? 'Enum' घोषणा का अर्थ?

enum nephews { hughie, louis, dewey } 
enum ducks { donald, daisy, scrooge, nephews } 

The language reference की गणना में घोषणा-पत्र के लिए नहीं करता है (जहाँ तक मैं बता सकता है) या तो private कीवर्ड या enum निर्माण के अर्थ का वर्णन की अनुमति दें अनुमति देता है।

क्या दस्तावेज उपलब्ध हैं? या वे व्याकरण में संरचनाओं के रूप में हैं जो भविष्य के विनिर्देश के लिए आरक्षित हैं?

उत्तर

3

यह उन दो कीवर्ड की मेरी अनौपचारिक समझ है।

enum nephews { hughie, louis, dewey } 

शब्दार्थ

open util/ordering[nephews] as nephewsOrd 

abstract sig nephews {} 

one sig hughie extends nephews {} 
one sig louis extends nephews {} 
one sig dewey extends nephews {} 

fact { 
    nephewsOrd/first = hughie 
    nephewsOrd/next = hughie -> louis + louis -> dewey 
} 

के बराबर private कीवर्ड मतलब है कि अगर एक sig private विशेषता है, अपने लेबल एक ही मॉड्यूल के भीतर निजी है। यह निजी क्षेत्रों और निजी कार्यों के लिए भी लागू होता है।

+0

धन्यवाद; यह सहायक है। मुझे लगता है कि यह एक ही नाम का उपयोग एक गणना में किया गया है और एक और गणना के नाम के रूप में एक त्रुटि होगी। (ठीक है, यह आसानी से चेक करने योग्य है, मैं क्यों पूछ रहा हूं कि मैं अपने लिए कब खोज सकता हूं? - हाँ, मिश्र धातु 4.2 आरसी इसे एक त्रुटि के रूप में झुकाता है। ठीक है, धन्यवाद।) –

+0

मुझे यह भी लगता है कि 'निजी' http पर प्रलेखित है : //alloy.mit.edu/alloy/documentation/quickguide/private.html –

0

पिछले स्वीकृत उत्तर के अलावा, मैं enum एस पर मिश्र धातु के साथ एक सप्ताह के अनुभव से कुछ उपयोगी अंतर्दृष्टि जोड़ना चाहता हूं, विशेष रूप से मानक sig के साथ मुख्य अंतर पर।

यदि आप abstract sig + extend का उपयोग करते हैं, तो आप एक मॉडल के साथ आएंगे जिसमें एक ही अवधारणा के अनुरूप कई सेट हैं। शायद एक उदाहरण इसे बेहतर साबित कर सकता है। मान लीजिए somthing

तरह
sig Car { 
    dameges: set Damage 
} 

आप पसंद

abstract sig Damage {} 
sig MajorDamage, MinorDamage extends Damage {} 

उपयोग करने के लिए बनाम

enum Damage { 
    MajorDamage, MinorDamage 
} 

पहले मामले में हम अलग अलग MinorDamage परमाणुओं के साथ एक मॉडल wiht आ सकते हैं (MinorDamage0, है MinorDamage1, ...) कारों से एसोसिएट, जबकि दूसरे मामले में आपके पास हमेशा एक ही माइनरडामेज होता है जिसके लिए विभिन्न कारें संदर्भित कर सकती हैं।

इस मामले में abstract sig + extend फ़ॉर्म का उपयोग करने के लिए कुछ समझ हो सकती है (क्योंकि आप विभिन्न माइनरडामेज या मेजरडामेज तत्वों को ट्रैक करने का निर्णय ले सकते हैं)।

दूसरी ओर, यदि आप एक currentState: set State करना चाहते हैं, यह करने के लिए एक

enum State {Damaged, Parked, Driven} 

उपयोग करने के लिए अवधारणा मैप करने के लिए, क्रम में ठीक तीन State जो प्रत्येक Car का उल्लेख कर सकते करने के लिए बेहतर हो सकता है । इस तरह, Visualizer में, आप अपने मॉडल को बिल्कुल राज्यों में प्रोजेक्ट करने का निर्णय ले सकते हैं और यह इस राज्य से जुड़े सभी Car एस को हाइलाइट करेगा। आप abstract + extend निर्माण के साथ ऐसा नहीं कर सकते हैं, क्योंकि MajorDamage0 पर प्रोजेक्टिंग से संबंधित केवल Car को हाइलाइट करेगा और कुछ भी नहीं।

तो, निष्कर्ष में, यह वास्तव में निर्भर करता है कि आपको क्या करना है।

इसके अलावा, यह ध्यान रखें कि यदि आप X तत्वों द्वारा रचित एक enum है और

run some_predicate for Y 

जहां वाई < एक्स, मिश्र धातु सभी में कोई उदाहरण का उत्पादन निष्पादित। तो, हमारे आखिरी उदाहरण में, हमारे पास वाई < 3.

अंतिम नोट के रूप में, यदि आप मैजिक लेआउट बटन का उपयोग करते हैं तो enums हमेशा विज़ुअलाइज़र में दिखाई नहीं देते हैं, लेकिन जैसा कि मैंने पहले कहा था enum पर अपने मॉडल "परियोजना" कर सकते हैं और enum के विभिन्न तत्वों के बीच स्विच कर सकते हैं।

संबंधित मुद्दे