স্কিমে একা ?, একভি ?, সমান ?, এবং = এর মধ্যে পার্থক্য কী?


87

আমি ভাবছি যে স্কিমের সেই অপারেশনগুলির মধ্যে পার্থক্য কি। স্ট্যাক ওভারফ্লোতে আমি একই রকম প্রশ্ন দেখেছি তবে সেগুলি লিস্প সম্পর্কে, এবং এই তিনটি অপারেটরের মধ্যে কোনও তুলনা নেই।

আমি স্কিমে বিভিন্ন ধরণের কমান্ড লিখছি এবং আমি নিম্নলিখিত ফলাফলগুলি পেয়েছি:

(eq? 5 5) -->#t
(eq? 2.5 2.5) -->#f
(equal? 2.5 2.5) --> #t
(= 2.5 2.5) --> #t

কেন এই ক্ষেত্রে?


4
এবং এছাড়াও রয়েছে eqv?, যার অর্থ ভিন্ন eq?বাequal?
নিউএ্যাক্ট

উত্তর:


160

আমি এই প্রশ্নের উত্তর বাড়িয়ে দেব। আসুন =সমতুল্য পূর্বাভাস দিয়ে শুরু করা যাক । =সম্পৃক্ত কি না চেক করতে দুটি সংখ্যার সমান ব্যবহার করা হয়। আপনি যদি এটি একটি সংখ্যা ছাড়া অন্য কিছু সরবরাহ করেন তবে এটি একটি ত্রুটি বাড়িয়ে তুলবে:

(= 2 3)     => #f
(= 2.5 2.5) => #t
(= '() '()) => error

eq?সম্পৃক্ত তার দুটি প্যারামিটার মেমরি একই বস্তুর respresent কিনা তা যাচাই করতে ব্যবহার করা হয়। উদাহরণ স্বরূপ:

(define x '(2 3))
(define y '(2 3))
(eq? x y)         => #f
(define y x)
(eq? x y)         => #t

তবে মনে রাখবেন যে '()মেমরিতে কেবল একটি খালি তালিকা রয়েছে (প্রকৃতপক্ষে শূন্য তালিকায় মেমরির উপস্থিতি নেই, তবে মেমরির অবস্থানের একটি পয়েন্টার 0খালি তালিকা হিসাবে বিবেচনা করা হয়)। তাই খালি তালিকার তুলনা করার সময় eq?সর্বদা ফিরে আসবে #t(কারণ তারা স্মৃতিতে একই বস্তুর প্রতিনিধিত্ব করে):

(define x '())
(define y '())
(eq? x y)      => #t

এখন বাস্তবায়নের উপর নির্ভর করে আদিম মানের যেমন সংখ্যা, স্ট্রিং ইত্যাদির জন্য eq?ফিরে আসতে পারে বা নাও পারে #tউদাহরণস্বরূপ:

(eq? 2 2)     => depends upon the implementation
(eq? "a" "a") => depends upon the implementation

এখানেই eqv?প্রিডিটেক ছবিতে আসে। এটি eqv?হ'ল eq?প্রাকটিকের মতো একই , এটি সর্বদা #tএকই আদিম মানের জন্য ফিরে আসবে । উদাহরণ স্বরূপ:

(eqv? 2 2)     => #t
(eqv? "a" "a") => depends upon the implementation

অতএব eqv?একটি সুপারসেট eq?এবং বেশিরভাগ ক্ষেত্রে আপনার eqv?পরিবর্তে ব্যবহার করা উচিত eq?

অবশেষে আমরা equal?প্রিফিকেটে আসি । equal?সম্পৃক্ত হিসাবে একই ঠিক eqv?ছাড়া এটি কিনা দুই তালিকা, ভেক্টর, ইত্যাদি উপাদান যা সন্তুষ্ট সংশ্লিষ্ট আছে পরীক্ষা ব্যবহার করা যেতে পারে সম্পৃক্ত eqv?সম্পৃক্ত। উদাহরণ স্বরূপ:

(define x '(2 3))
(define y '(2 3))
(equal? x y)      => #t
(eqv? x y)        => #f

সাধারণভাবে:

  1. =আপনি দুটি সংখ্যা সমান কিনা তা পরীক্ষা করতে ইচ্ছুক থাকাকালীন প্রাকটিকেটটি ব্যবহার করুন ।
  2. eqv?দুটি অ-সংখ্যাসূচক মান সমান কিনা তা পরীক্ষা করতে আপনি যখন চান তখন প্রিকিকেটটি ব্যবহার করুন ।
  3. equal?আপনি দুটি তালিকা, ভেক্টর, ইত্যাদির সমতুল্য কিনা তা পরীক্ষা করতে ইচ্ছুক হলে প্রিকেটটি ব্যবহার করুন ।
  4. eq?আপনি কী করছেন ঠিক বুঝতে না পারলে প্রাকটিকেট ব্যবহার করবেন না ।

7
আমি যতদূর জানি (eqv? "a" "a") ==> unspecified। আপনাকে ব্যবহার করতে হবে equal?(সম্ভবত আরও বেশি অনুকূলিত)string=?
সিলেস্টার

4
অনুযায়ী প্রতিবেদন , (eq? '(1) '(1))হয় অনির্দিষ্ট তাই আপনার, (define x '(1 2))চিত্রণ কাজ নাও করতে পারে।
নেস

4
খুব নির্ভুল এবং তথ্যবহুল। বিশেষত শেষে গাইডলাইনস।
জার্মেইন ডায়াগো

4
তবে এক? প্রতীকগুলির জন্য সংজ্ঞায়িত বলে মনে হয় এবং এটি লক্ষ করা উচিত! প্রতীকগুলি যদি একই রকম হয়, তবে? # টি ফেরত উদাহরণ (eq? 'foo 'foo) -> #t, (eq? 'foo 'bar)-> মিথ্যা ` আমি এটি এখানে এবং এখানে
নেডকো

13

RnRS একটি পূর্ণ দুটি পৃষ্ঠা এর সাথে সম্পর্কিত নির্দিষ্টকরণ আছে eq?, eqv?, equal? and =। এখানে খসড়া আর 7 আরএস নির্দিষ্টকরণ রয়েছে । এটা দেখ!

ব্যাখ্যা:

  • = সংখ্যার তুলনা করুন, 2.5 এবং 2.5 টি সংখ্যাগতভাবে সমান।
  • equal?সংখ্যাগুলি হ্রাস করার জন্য =, 2.5 এবং 2.5 টি সংখ্যাগতভাবে সমান।
  • eq?'পয়েন্টার' তুলনা করে। আপনার স্কিম প্রয়োগের 5 নম্বর, একটি 'তাত্ক্ষণিক' (সম্ভবত) হিসাবে প্রয়োগ করা হয়, সুতরাং 5 এবং 5 অভিন্ন। 2.5 নম্বরটি আপনার প্রকল্প বাস্তবায়নে 'ভাসমান পয়েন্ট রেকর্ড' বরাদ্দের প্রয়োজন হতে পারে, দুটি পয়েন্টার অভিন্ন নয়।

4
খসড়া আর 7 আরএস স্পেসিফিকেশনের লিঙ্কটি 2018-02-04 অনুযায়ী মারা গেছে
যেরেমিয়া পেসকা

4
লাইভ লিঙ্কে আপডেট হয়েছে।
GoZoner

10

eq?এটি #tযখন একই ঠিকানা / অবজেক্ট হয়। সাধারণত কেউ একই প্রতীক, বুলিয়ান এবং অবজেক্ট এবং #f এর জন্য বিভিন্ন ধরণের বিভিন্ন মানের জন্য বিভিন্ন মানের মূল্য প্রত্যাশা করতে পারে বা একই কাঠামো নয়, স্কিম / লিস্প-বাস্তবায়নের ক্ষেত্রে তাদের পয়েন্টারে এম্বেড টাইপ এবং এমবেড করার tradition তিহ্য রয়েছে যদি পর্যাপ্ত স্থান হয় তবে একই স্থানের মান। এভাবে কিছু পয়েন্টার সত্যিই না ঠিকানাগুলি কিন্তু মূল্যবোধ, গৃহস্থালির কাজ মত Rবা Fixnum 10। এগুলি eq?হ'ল কারণ "ঠিকানা" একটি এম্বেডড টাইপ + মান is কিছু বাস্তবায়ন অপরিবর্তনীয় ধ্রুবকগুলি পুনরায় ব্যবহার করে। (eq? '(1 2 3)' (1 2 3)) ব্যাখ্যা করা হলেও #f হতে পারে তবে সংকলন করা হতে পারে কারণ এটি একই ঠিকানা পেতে পারে। (জাভায় ধ্রুব স্ট্রিং পুলের মতো)। এই কারণে, জড়িত অনেক এক্সপ্রেশনeq? অনির্ধারিত, সুতরাং এটি # টি বা #f এর মূল্যায়ন বাস্তবায়ন নির্ভর।

eqv?একই জিনিস হিসাবে # টি হয় eq?। এটি কোনও সংখ্যা বা চরিত্রের ক্ষেত্রেও যদি # টি হয় এবং এর মান একই হয় , এমনকি ডেটারটি কোনও পয়েন্টারের সাথে মানানসই হয় না। সুতরাং eqv?এই ধরণের যাচাইয়ের অতিরিক্ত কাজটি অন্যতম সমর্থিত, এটি উভয়ই একই ধরণের এবং এটির লক্ষ্যবস্তু অবজেক্টগুলির একই ডেটা মান রয়েছে।

equal?eqv?জোড়, ভেক্টর, স্ট্রিং এবং বাইটভেেক্টরের মতো যৌগিক ধরণের অংশগুলির সাথে এটি পুনরাবৃত্তভাবে করে যেমন একই জিনিসগুলির জন্য # টি হয় equal?অনুশীলনে এটি দুটি টি একই জিনিস দেখায় ফিরে আসবে । আর 6 আরএস এর আগে, equal?বিজ্ঞপ্তি কাঠামো ব্যবহার করা অসুরক্ষিত ।

=মত eqv?তবে এটি কেবল সংখ্যার ধরণের জন্য কাজ করে । এটি আরও দক্ষ হতে পারে।

string=?মত equal?, তবে এটি কেবল স্ট্রিংয়ের জন্য কাজ করে। এটি আরও দক্ষ হতে পারে।


6

equal? পুনরাবৃত্তভাবে সমতার জন্য দুটি বস্তুর (যে কোনও ধরণের) তুলনা করে।

  • নোট করুন এটি কোনও বৃহত ডাটা স্ট্রাকচারের জন্য ব্যয়বহুল হতে পারে যেহেতু সম্ভাব্যভাবে পুরো তালিকা, স্ট্রিং, ভেক্টর ইত্যাদিকে অবশ্যই ট্র্যাভার করা উচিত।

  • বস্তু কেবলমাত্র একটি উপাদান থাকে (যেমন: সংখ্যা, চরিত্র, ইত্যাদি), এই হিসাবে একই eqv?


eqv? উভয়টিকে "একই জিনিস হিসাবে সাধারণত বিবেচনা করা হয়" তা নির্ধারণ করতে দুটি বস্তু পরীক্ষা করে।

  • eqv?এবং eq?খুব অনুরূপ অপারেশন, এবং তাদের মধ্যে পার্থক্য কিছুটা বাস্তবায়ন নির্দিষ্ট হতে চলেছে।

eq?হিসাবে একই eqv?তবে সূক্ষ্ম পার্থক্য সনাক্ত করতে সক্ষম হতে পারে এবং আরও দক্ষতার সাথে প্রয়োগ করা যেতে পারে।

  • অনুমান অনুসারে, এটি আরও জটিল ক্রিয়াকলাপের বিরোধী হিসাবে দ্রুত এবং দক্ষ পয়েন্টার তুলনা হিসাবে প্রয়োগ করা যেতে পারে eqv?


= সংখ্যাগত সমতার জন্য সংখ্যার তুলনা করে।

  • মনে রাখবেন যে দুটিরও বেশি সংখ্যক সরবরাহ করা যেতে পারে, যেমন: (= 1 1.0 1/1 2/2)

আমি ভেবেছিলাম eq?প্রকৃত পয়েন্টার সমতা (নয় eqv?)। এটি "সেরা বা সবচেয়ে বৈষম্যমূলক"। উদাহরণস্বরূপ (eqv? 2 2)গ্যারান্টিযুক্ত #tতবে (eq? 2 2)এটি "অনির্ধারিত"। অর্থাৎ এটি প্রয়োগ করা প্রতিটি সদ্য পঠিত সংখ্যার জন্য প্রকৃত নতুন মেমরি অবজেক্ট তৈরি করে কিনা, বা যদি তৈরি করতে পারে তবে পূর্বে নির্মিত একটিটিকে পুনরায় ব্যবহার করে কিনা তা নির্ভর করে।
নেস

@ উইলনেস - ভাল ধরা, ধন্যবাদ অন্যান্য অপারেশনগুলির তুলনায় eq?এবং eqv?এর মধ্যে পার্থক্যগুলি আরও সূক্ষ্ম।
জাস্টিন এথিয়ার

5

আপনি কোনও স্কিম প্রয়োগের কথা উল্লেখ করেন না, তবে র‌্যাকেটে eq?কেবল যুক্তি একই জিনিসকে বোঝায় তবেই সত্য ফিরে আসে। আপনার দ্বিতীয় উদাহরণটি #f উপার্জন করছে কারণ সিস্টেম প্রতিটি যুক্তির জন্য একটি নতুন ভাসমান পয়েন্ট নম্বর তৈরি করছে; তারা একই জিনিস না।

equal?এবং =মান সমতা জন্য অনুসন্ধান করা হয়, কিন্তু =শুধুমাত্র সংখ্যার জন্য প্রযোজ্য।

আপনি যদি র‌্যাকেট ব্যবহার করছেন তবে আরও তথ্যের জন্য এখানে চেক করুন। অন্যথায়, আপনার প্রকল্প বাস্তবায়নের ডকুমেন্টেশন চেক করুন।


4
আরও ভাল ... স্পেসিফিকেশনটি পড়ুন ... r6rs.org/final/html/r6rs/r6rs-ZH-14.html#node_sec_11.5
ডার্ক

3

eq?পয়েন্টার সমতা হিসাবে ভাবেন । প্রতিবেদনের লেখকরা এটিকে যথাসম্ভব সাধারণ হতে চান তাই তারা এটিকে একেবারেই না বলে কারণ এটি বাস্তবায়ন-নির্ভর, এবং এটি বলতে পয়েন্টার-ভিত্তিক বাস্তবায়নকে সমর্থন করবে। তবে তারা বলে

একা সাধারণত কার্যকর করা সম্ভব হবে? ইকিভি? এর চেয়ে অনেক বেশি দক্ষতার সাথে, উদাহরণস্বরূপ, একটি সাধারণ পয়েন্টার তুলনা হিসাবে

এখানে আমি যা বলতে চাইছি তা এখানে। (eqv? 2 2)প্রত্যাবর্তনের গ্যারান্টিযুক্ত #tতবে (eq? 2 2)অনির্ধারিত। এখন একটি পয়েন্টার ভিত্তিক বাস্তবায়ন কল্পনা করুন। এটিতে eq?কেবল পয়েন্টার তুলনা হয়। যেহেতু (eq? 2 2)অনির্ধারিত, এর অর্থ এই বাস্তবায়নটি সোর্স কোড থেকে পড়া প্রতিটি নতুন সংখ্যার নতুন মেমরি অবজেক্টের উপস্থাপনা তৈরি করতে বিনামূল্যে। eqv?অবশ্যই তার যুক্তিগুলি পরীক্ষা করতে হবে ect

OTOH (eq 'a 'a)হয় #t। এর অর্থ এই যে এই ধরনের বাস্তবায়ন ডুপ্লিকেট নামের সাথে চিহ্ন চিনতে এবং একই ব্যবহার করা আবশ্যক এক তাদের সব জন্য মেমরি প্রতিনিধিত্ব অবজেক্ট।

মনে করুন কোনও বাস্তবায়ন পয়েন্টার ভিত্তিক নয়। যতক্ষণ না এটি প্রতিবেদনে মেনে চলে, ততক্ষণ কোনও ব্যাপার হয় না। লেখকরা কেবল প্রয়োগকারীদের প্রয়োগের সুনির্দিষ্ট বিবরণ হিসাবে দেখাতে চান না, তাই তারা সাবধানতার সাথে তাদের শব্দটি বেছে নিন।

এটি যাইহোক আমার অনুমান।

সুতরাং খুব মোটা, eq?পয়েন্টার সমতা, eqv?এটি (পারমাণবিক-) মান-সচেতন, equal?কাঠামো-সচেতন (এটির পুনরাবৃত্তভাবে তর্কগুলি পরীক্ষা করে, যাতে শেষ পর্যন্ত (equal? '(a) '(a))হওয়া প্রয়োজন #t), =সংখ্যার string=?জন্য, স্ট্রিংগুলির জন্য এবং বিশদগুলি হয় রিপোর্টে।


0

পূর্ববর্তী উত্তরগুলি বাদে আমি কিছু মন্তব্য যুক্ত করব।

এই সমস্ত পূর্বাভাস identityএকটি বস্তুর জন্য বিমূর্ত ফাংশনটি কিন্তু বিভিন্ন প্রসঙ্গে সংজ্ঞায়িত করতে চায় ।

EQ?এটি বাস্তবায়ন নির্ভর এবং এটি are 2 objects the same?কেবল সীমিত ব্যবহারে প্রশ্নের উত্তর দেয় না । বাস্তবায়ন দৃষ্টিকোণ থেকে, এই প্রাকটিক্যালটি কেবল 2 টি সংখ্যার (বস্তুর প্রতি নির্দেশক) তুলনা করে, এটি বস্তুর সামগ্রীতে নজর রাখে না। সুতরাং, উদাহরণস্বরূপ, যদি আপনার প্রয়োগটি স্ট্রিংগুলিকে স্বতন্ত্রভাবে না রাখে তবে প্রতিটি স্ট্রিংয়ের জন্য আলাদা মেমরি বরাদ্দ করে তবে (eq? "a" "a")তা মিথ্যা হবে।

EQV?- এটি বস্তুর অভ্যন্তরে দেখায় তবে সীমিত ব্যবহারের সাথে। এটি বাস্তবায়ন-নির্ভর যদি এটির জন্য সত্য ফিরে আসে (eqv? (lambda(x) x) (lambda(x) x))। এখানে এই প্রাকটিকাকে কীভাবে সংজ্ঞায়িত করা যায় তার একটি সম্পূর্ণ দর্শন, যেমন আমরা আজকাল জানি যে সীমিত ব্যবহারের সাথে কিছু ফাংশনের কার্যকারিতা তুলনা করার জন্য কিছু দ্রুত পদ্ধতি রয়েছে। তবে eqv?বড় সংখ্যা, স্ট্রিং ইত্যাদির জন্য সুসংগত উত্তর সরবরাহ করে

ব্যবহারিকভাবে, এর মধ্যে কিছু ভবিষ্যদ্বাণীকারী কোনও বস্তুর বিমূর্ত সংজ্ঞা (গাণিতিকভাবে) ব্যবহার করার চেষ্টা করে, অন্যরা কোনও অবজেক্টের উপস্থাপনা (এটি কীভাবে বাস্তব মেশিনে প্রয়োগ করা হয়) ব্যবহার করে। পরিচয়ের গাণিতিক সংজ্ঞাটি লাইবনিজ থেকে এসেছে এবং এটি বলে:

X = Y  iff  for any P, P(X) = P(Y)
X, Y being objects and
P being any property associated with object X and Y.

আদর্শভাবে এটি কম্পিউটারে এই খুব সংজ্ঞাটি প্রয়োগ করতে সক্ষম হবেন তবে অনিবার্যতা এবং / বা গতির কারণে এটি আক্ষরিক অর্থে প্রয়োগ করা হয়নি। এই কারণেই প্রচুর অপারেটর রয়েছে যা প্রত্যেকে এই সংজ্ঞাটির চারপাশে বিভিন্ন দৃষ্টিভঙ্গির উপর দৃষ্টি নিবদ্ধ করার চেষ্টা করে।

ধারাবাহিকতার জন্য একটি পরিচয়ের বিমূর্ত সংজ্ঞা কল্পনা করার চেষ্টা করুন। এমনকি যদি আপনি ফাংশনগুলির একটি উপসেট ( সিগমা-রিকার্স ক্লাস অফ ফাংশন ) এর সংজ্ঞা দিতে পারেন তবে ভাষা কোনও প্রিডিকেটকে সত্য বা মিথ্যা বলে চাপায় না। এটি ভাষার সংজ্ঞা এবং বাস্তবায়ন অনেকগুলি জটিল করে তুলবে।

অন্যান্য পূর্বাভাসগুলির প্রসঙ্গটি বিশ্লেষণ করা সহজ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.