উত্তর:
একটি আক্রমনাত্মক ভেরিয়েবলের চেয়ে "ধারণাগত" is সাধারণভাবে, এটি প্রোগ্রাম স্টেটের একটি সম্পত্তি যা সর্বদা সত্য। একটি ফাংশন বা পদ্ধতি যা নিশ্চিত করে যে আক্রমণকারী হোল্ড করে তা হ'ল আক্রমণকারীকে বজায় রাখার জন্য।
উদাহরণস্বরূপ, একটি বাইনারি অনুসন্ধান গাছে অদলীয় থাকতে পারে যে প্রতিটি নোডের জন্য নোডের বাম সন্তানের চাবিটি নোডের নিজস্ব কী থেকে কম থাকে। এই গাছের জন্য একটি সঠিকভাবে লিখিত সন্নিবেশ ফাংশন সেই আক্রমণকারীটিকে বজায় রাখবে।
যেমন আপনি বলতে পারেন যে এটি কোনও চলকটিতে সংরক্ষণ করতে পারেন এমন জিনিস নয়: এটি প্রোগ্রাম সম্পর্কে আরও বিবৃতি । আপনার প্রোগ্রামটি কী ধরণের আক্রমণকারীদের বজায় রাখতে হবে তা নির্ধারণ করে, তারপরে আপনার কোডটি পর্যালোচনা করে নিশ্চিত করা যায় যে এটি আসলে সেই আক্রমণকারীদেরই রক্ষণাবেক্ষণ করে, আপনি আপনার কোডটিতে যৌক্তিক ত্রুটিগুলি এড়াতে পারবেন।
এটি এমন একটি শর্ত যা আপনি নিজের যুক্তিবিদ্যার কোনও নির্দিষ্ট স্থানে সর্বদা সত্য হতে জানেন এবং কী ভুল হয়েছে তা ডিবাগ করার সময় তা পরীক্ষা করতে পারেন।
আমি সাধারণত এগুলিকে অ্যালগরিদম বা কাঠামোর ক্ষেত্রে বেশি দেখি।
উদাহরণস্বরূপ, আপনার কাছে এমন একটি লুপ আক্রমণকারী থাকতে পারে যা দৃserted়ভাবে বলা যেতে পারে - প্রতিটি পুনরাবৃত্তির শুরুতে বা শেষে সর্বদা সত্য। এটি হ'ল, যদি আপনার লুপটি একটি স্ট্যাক থেকে অন্য স্ট্যাকের অবজেক্টগুলির সংগ্রহ প্রক্রিয়া করার কথা মনে করে তবে আপনি বলতে পারেন যে | stack1 | + | stack2 | = c, লুপের শীর্ষে বা নীচে।
যদি আক্রমণকারী চেক ব্যর্থ হয়, তবে এটি কিছু ভুল হয়ে গেছে তা নির্দেশ করবে। এই উদাহরণে, এর অর্থ এই হতে পারে যে আপনি প্রক্রিয়াজাত উপাদানটিকে চূড়ান্ত স্ট্যাকের দিকে ঠেলে দিতে ভুলে গিয়েছিলেন etc.
উইকিপিডিয়াটির যাদু: ইনভারেন্ট (কম্পিউটার বিজ্ঞান)
কম্পিউটার সায়েন্সে, একটি ভবিষ্যদ্বাণী যে যদি সত্য হয় তবে ক্রিয়াকলাপগুলির একটি নির্দিষ্ট ক্রম জুড়ে সত্যই থেকে যায়, তাকে বলা হয় (একটি) সেই অনুক্রমের আক্রমণকারী।
যেমন এই রেখাটি বলে:
কম্পিউটার সায়েন্সে, একটি ভবিষ্যদ্বাণী যে যদি সত্য হয় তবে ক্রিয়াকলাপগুলির একটি নির্দিষ্ট ক্রম জুড়ে সত্যই থেকে যায়, তাকে বলা হয় (একটি) সেই অনুক্রমের আক্রমণকারী।
এই আশা আরও ভালভাবে বুঝতে C ++ এ এই উদাহরণটি সহায়তা করে।
এমন একটি দৃশ্যের কথা বিবেচনা করুন যেখানে আপনাকে কিছু মান পেতে হবে এবং সেগুলি হিসাবে পরিচিত একটি ভেরিয়েবলের মোট সংখ্যা গণনা করতে হবে এবং এগুলি হিসাবে পরিচিত একটি ভেরিয়েবেলে count
যুক্ত করতে হবেsum
// invariant:
// we have read count grades so far, and
// sum is the sum of the first count grades
উপরের কোডটি এরকম কিছু হবে,
int count=0;
double sum=0,x=0;
while (cin >> x) {
++count;
sum+=x;
}
উপরের কোডটি কী করে?
1) ইনপুটটি পড়ে cin
এবং এগুলিতে রাখেx
2) একটি সফল পড়া পরে, বৃদ্ধি count
এবংsum = sum + x
3) পড়া বন্ধ না হওয়া পর্যন্ত 1-2 পুনরাবৃত্তি করুন (যেমন সিটিআরএল + ডি)
আক্রমণকারীটি অবশ্যই সর্বদা সত্য । সুতরাং প্রাথমিকভাবে আপনি ঠিক এই দিয়ে আপনার কোড শুরু
while(cin>>x){
}
এই লুপটি স্ট্যান্ডার্ড ইনপুট এবং এক্স স্টোর থেকে ডেটা পড়বে। বেশ এবং ভাল. তবে আক্রমণকারীটি মিথ্যা হয়ে যায় কারণ আমাদের আক্রমণকারীটির প্রথম অংশটি অনুসরণ করা হয়নি (বা সত্য রাখা হয়েছে)।
// we have read count grades so far, and
সরল! বর্ধিত গণনা
সুতরাং ++count;
ভাল করতে হবে !. এখন আমাদের কোডটি এমন কিছু হয়ে যায়,
while(cin>>x){
++count;
}
এমনকি এখন আমাদের আক্রমণকারী (একটি ধারণা অবশ্যই সত্য হওয়া উচিত) এটি মিথ্যা কারণ এখন আমরা আমাদের আক্রমণকারীটির দ্বিতীয় অংশটি সন্তুষ্ট করি নি ।
// sum is the sum of the first count grades
তাহলে এখন কি করতে হবে?
যোগ x
করার জন্য sum
এবং এ সঞ্চয় sum
( sum+=x
) এবং পরের বার
cin>>x
এক্স মধ্যে একটি নতুন মান পড়বে।
এখন আমাদের কোডটি এমন কিছু হয়ে যায়,
while(cin>>x){
++count;
sum+=x;
}
// invariant:
// we have read count grades so far, and
// sum is the sum of the first count grades
কোড:
while(cin>>x){
++count;
sum+=x;
}
আহ !. এখন লুপের আক্রমণকারীটি সর্বদা সত্য এবং কোডটি ভাল কাজ করে।
উপরের উদাহরণটি অ্যান্ডেলু-কোইনিং এবং বার্বারা-ই-এর অ্যাকসিলারেটেড সি ++ বই থেকে নেওয়া এবং সংশোধিত হয়েছিল
তা থেকে কি উপর পর invariants পরিষ্কার কোড লেখা, ধারণার দিক থেকে বুদ্ধিমান কি invariants উপস্থিত থাকা উচিত যেহেতু বেশ উপযোগী মধ্যে আপনার কোড আপনি সহজেই কিভাবে এই লক্ষ্য পৌঁছানোর আপনার কোড সংগঠিত করার সিদ্ধান্ত নিতে পারেন। ইলিয়ের হিসাবে উল্লেখ করা হয়েছে, এগুলি ডিবাগিংয়েও দরকারী, যেহেতু আক্রমণকারীটির রক্ষণাবেক্ষণ করা হচ্ছে কিনা তা যাচাই করা যদি আপনি সম্পাদনা করার চেষ্টা করছেন যে ম্যানিপুলেশনটি বাস্তবে আপনি চান তা করছেন কিনা তা দেখার জন্য এটি বেশ ভাল উপায়।
এটি সাধারণত এমন একটি পরিমাণ যা কিছু নির্দিষ্ট গাণিতিক ক্রিয়াকলাপে পরিবর্তিত হয় না। একটি উদাহরণ একটি স্কেলার, যা আবর্তনের অধীনে পরিবর্তন হয় না। চৌম্বকীয় অনুরণন চিত্রটিতে, উদাহরণস্বরূপ, আবর্তনকারী আক্রমণকারী দ্বারা একটি টিস্যু সম্পত্তি চিহ্নিত করতে এটি দরকারী, কারণ তখন এর অনুমানটি আদর্শভাবে স্ক্যানারে শরীরের অভিযোজনের উপর নির্ভর করে না।
এই উত্তরটি আমার 5 বছরের বাচ্চাটির জন্য। কোনও আক্রমণকারীকে ধ্রুবক বা স্থির সংখ্যাসূচক মান হিসাবে ভাবেন না। তবে তা হতে পারে। তবে এটি এর চেয়ে বেশি।
বরং, আক্রমণকারী হ'ল বিবিধ সত্তার মধ্যে স্থির সম্পর্কের মতো। উদাহরণস্বরূপ, আপনার জৈবিক পিতামাতার তুলনায় আপনার বয়স সর্বদা তার চেয়ে কম হবে be আপনার বয়স এবং আপনার পিতামাতার বয়স উভয়ই সময়ের সাথে সাথে পরিবর্তিত হয়, তবে আমি উপরে যে সম্পর্কটি উল্লেখ করেছি তা হ'ল এক আক্রমণকারী।
একটি আক্রমণকারীও সংখ্যাসূচক ধ্রুবক হতে পারে। উদাহরণস্বরূপ, এর মানটি pi
তার ব্যাসের চেয়ে বৃত্তের পরিধিগুলির মধ্যে একটি অলৌকিক অনুপাত। চেনাশোনাটি যত বড় বা ছোট হোক না কেন, অনুপাতটি সর্বদা থাকবে pi
।
এডিটি আক্রমণকারী ডেটা ক্ষেত্রগুলির মধ্যে সম্পর্কের উল্লেখ করে (উদাহরণস্বরূপ ভেরিয়েবল) যে কোনও উদাহরণ পদ্ধতি কার্যকর করার আগে এবং পরে সর্বদা সত্য হওয়া উচিত।
একটি আক্রমণকারী এবং এটি অনুশীলনের জাভা কনকুরেন্সি বইয়ে কেন গুরুত্বপূর্ণ তা সম্পর্কে একটি চমৎকার উদাহরণ রয়েছে ।
যদিও জাভা কেন্দ্রিক, উদাহরণটিতে এমন কিছু কোড বর্ণিত হয়েছে যা সরবরাহিত পূর্ণসংখ্যার কারণগুলি গণনা করার জন্য দায়বদ্ধ। উদাহরণ কোডটি প্রদত্ত শেষ সংখ্যাটিকে ক্যাশে করার চেষ্টা করে এবং কার্যকারিতা উন্নত করতে যে কারণগুলি গণনা করা হয়েছিল। এই দৃশ্যে এমন একটি আক্রমণকারী রয়েছে যা উদাহরণ কোডে গণ্য হয় নি যা কোডটি একযোগে দৃশ্যে রেস শর্তে সংবেদনশীল রেখে গেছে।
এখানে সমস্ত উত্তর দুর্দান্ত, তবে আমি অনুভব করেছি যে আমি এই বিষয়ে আরও আলোকপাত করতে পারি:
ভাষার দৃষ্টিকোণ থেকে আক্রমণকারী অর্থ এমন কিছু যা কখনও পরিবর্তন হয় না। ধারণাটি আসলে গণিত থেকে আসে তবে আনয়নের সাথে মিলিত হওয়ার পরে এটি অন্যতম জনপ্রিয় প্রমাণ কৌশল।
এখানে প্রমাণ হিসাবে যায় যে, আপনি যদি প্রাথমিক অবস্থায় থাকা কোনও আক্রমণকারীকে খুঁজে পেতে পারেন এবং এই আক্রমণকারী রাষ্ট্রের ক্ষেত্রে প্রয়োগ করা কোনও [আইনী] রূপান্তর নির্বিশেষে স্থির থাকে, তবে আপনি প্রমাণ করতে পারবেন যে কোনও নির্দিষ্ট রাষ্ট্রের কাছে এটি না থাকলে আক্রমণকারী তখন এটি কখনই ঘটতে পারে না, প্রাথমিক অবস্থাতে রূপান্তরগুলির যে অনুক্রমটি প্রয়োগ করা হয় তা নির্বিশেষে।
এখন আগের চিন্তাভাবনাটি (আবার অন্তর্ভুক্তির সাথে মিলিত) কম্পিউটার সফ্টওয়্যারটির যুক্তিটিকে ভবিষ্যদ্বাণী করা সম্ভব করে। বিশেষত গুরুত্বপূর্ণ যখন মৃত্যুদন্ড কার্যকর করা হয়, যেখানে কোনও আক্রমণকারীকে প্রমাণ করা যায় যে একটি নির্দিষ্ট লুপ একটি নির্দিষ্ট ফল দেয় বা এটি কোনও প্রোগ্রামের অবস্থাকে কখনই কোনও নির্দিষ্ট উপায়ে পরিবর্তন করে না।
যখন আক্রমণকারীটি কোনও লুপ লজিকের ভবিষ্যদ্বাণী করতে ব্যবহৃত হয় তাকে ডাকা লুপ ইনগ্রিয়েন্ট । এটি বাইরের লুপগুলি ব্যবহার করা যেতে পারে তবে লুপগুলির জন্য এটি সত্যই গুরুত্বপূর্ণ কারণ আপনার প্রায়শই প্রচুর সম্ভাবনা থাকে বা অসীম সম্ভাবনা থাকে।
লক্ষ্য করুন যে আমি কম্পিউটার সফ্টওয়্যারটির যুক্তিটি "প্রিকিকেট" ব্যবহার করি, এবং প্রমাণ করি না। কারণ এটি যখন গণিতের আক্রমণকারীকে একটি প্রমাণ হিসাবে ব্যবহার করা যায়, এটি কখনই প্রমাণ করতে পারে না যে কম্পিউটার নির্বাহ করা হলে কম্পিউটার সফ্টওয়্যার প্রত্যাশিত ফল দেয় যা এই সফ্টওয়্যারটি বহু বিমূর্ততার শীর্ষে নির্বাহ করা হয়, এটি কখনও প্রমাণিত হতে পারে না যা তারা প্রত্যাশিত যা ফলন করবে (উদাহরণস্বরূপ হার্ডওয়্যার বিমূর্তনের কথা ভাবেন)।
অবশেষে যখন তাত্ত্বিকভাবে এবং কঠোরভাবে ভবিষ্যদ্বাণী করা সফ্টওয়্যার যুক্তি কেবল মেডিকেল এবং সামরিক বিষয়গুলির মতো উচ্চ সমালোচনামূলক অ্যাপ্লিকেশনগুলির জন্য গুরুত্বপূর্ণ। ডিবাগ করার সময় সাধারণত প্রোগ্রামারটিকে সহায়তা করার জন্য ইনভেরেন্ট ব্যবহার করা যেতে পারে। এটি নির্দিষ্ট স্থানে কোথায় ছিল তা জানতে ব্যবহার করা যেতে পারে প্রোগ্রামটি ব্যর্থ হয়েছিল কারণ এটি একটি নির্দিষ্ট আক্রমণকারীকে বজায় রাখতে ব্যর্থ হয়েছে - আমরা অনেকেই এ সম্পর্কে কোনও চিন্তা না দিয়েই এটিকে ব্যবহার করি।