কঠোর ইতিবাচকতা


10

এই উল্লেখ থেকে: কঠোর ইতিবাচকতা

কঠোর ইতিবাচক অবস্থা যেমন ঘোষণাকে বাতিল করে দেয়

data Bad : Set where
 bad : (Bad → Bad) → Bad
         A      B       C
 -- A is in a negative position, B and C are OK

এ কেন নেতিবাচক? এছাড়াও কেন বি অনুমোদিত? আমি বুঝতে পারছি কেন সি অনুমোদিত?


1
এটিকে কেন "নেতিবাচক" বলা হয় তা আমি নিশ্চিত নই, তবে এটির ত্রুটি দ্বারা এটি আরও বেশি পরিচিত: স্ট্যাক ওভারফ্লো :) এই কোডটি Aঅবশেষে স্ট্যাকের বিস্তৃতি এবং বিস্ফোরণ ঘটায় (স্ট্যাক ভিত্তিক ভাষায়)।
wvxvw

এই অংশটি আমি বুঝতে পারি যে আপনি নির্বিচারে জিনিস লিখতে পারেন এবং সুতরাং গণনা অ-সমাপ্তি হবে। ধন্যবাদ
পুষ্প

1
আমার মনে হয় এটা অ পরিসমাপ্তি উল্লেখ করার জন্য একটি ভাল জিনিস হবে শরীর আপনার প্রশ্নের। আমি আপনার মন্তব্যের উপর ভিত্তি করে আমার উত্তর আপডেট করেছি।
আন্তন ট্রুনভ

@wvxvw অগত্যা, এটি কেবল স্ট্যাকটি ফুটিয়ে না দিয়ে চিরকালের জন্য চলতে পারে, যদি সংকলকটি লেজ পুনরাবৃত্তি প্রয়োগ করে, যেমন নীচের ওসিএমেলে আমার উদাহরণটি স্ট্যাকটি বিস্ফোরিত না করে।
আন্তন ট্রুনভ

1
@ অ্যান্টন ট্রুনভ নিশ্চিত, এটি সুনির্দিষ্ট হওয়ার চেয়ে বরং সাইটের নামে আরও বেশি শ্লেষ ছিল।
wvxvw

উত্তর:


17

প্রথমে একটি পরিভাষা ব্যাখ্যা: negativeণাত্মক এবং ধনাত্মক অবস্থানগুলি যুক্তি থেকে আসে। এগুলি যৌক্তিক সংযোজকগুলির একটি অনুমানের বিষয়ে: A বি থেকে আলাদা আচরণ করে । বিভাগ তত্ত্বে অনুরূপ একটি ঘটনা ঘটে, যেখানে আমরা যথাক্রমে নেতিবাচক এবং ধনাত্মক পরিবর্তে বিপরীতমুখী এবং কোভারিয়েন্ট বলি । পদার্থবিজ্ঞানে তারা এমন পরিমাণের কথা বলে যা "সমবায়" এবং "বিপরীতেও আচরণ করে। সুতরাং এটি খুব সাধারণ ঘটনা A কোনও প্রোগ্রামার তাদের" ইনপুট "এবং" আউটপুট "হিসাবে ভাবতে পারে।একজনবিএকজনবি

এখন সূচক ডেটাটাইপগুলিতে।

একটি প্রস্তাবনামূলক ডাটাটাইপ চিন্তা বীজগাণিতিক গঠন এক ধরনের হিসাবে: কনস্ট্রাকটর যা অপারেশন উপাদান নেওয়া হয় টি আর্গুমেন্ট হিসাবে এবং নতুন উপাদান উত্পাদন টি । এটি সাধারণ বীজগণিতের সাথে খুব অনুরূপ: সংযোজন দুটি সংখ্যা নেয় এবং একটি সংখ্যা উত্পাদন করে।টিটিটি

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

  • যদি cকোনও ধ্রুবক হয় তবে আমরা এটিকে একটি ফাংশন unit -> Tবা সমতুল্য হিসাবে ভাবতে পারি (empty -> T) -> T,
  • যদি cঅবিচ্ছিন্ন থাকে তবে আমরা এটিকে একটি ফাংশন T -> Tবা সমতুল্য হিসাবে ভাবতে পারি (unit -> T) -> T,
  • যদি cহয় বাইনারি আমরা একটি ফাংশন হিসাবে এটা মনে করতে পারেন T -> T -> T, অথবা equivalently T * T -> T, অথবা equivalently (bool -> T) -> T,
  • যদি আমরা এমন একটি কনস্ট্রাক্টর চাইতাম cযেটি সাতটি আর্গুমেন্ট গ্রহণ করে, তবে আমরা এটিকে এমন একটি ফাংশন হিসাবে দেখতে পেতাম (seven -> T) -> Tযেখানে sevenসাতটি উপাদানের সাথে পূর্বনির্ধারিত টাইপ রয়েছে।
  • আমাদের কাছে এমন একটি কনস্ট্রাক্টরও থাকতে পারে cযা প্রচুর পরিমাণে তর্কগুলি গ্রহণ করে, এটি একটি ফাংশন (nat -> T) -> T

এই উদাহরণগুলি দেখায় যে কোনও কনস্ট্রাক্টরের সাধারণ ফর্মটি হওয়া উচিত

c : (A -> T) -> T

যেখানে আমরা কল arity এর এবং আমরা মনে একটি কন্সট্রাকটর যে লাগে ধরনের -many আর্গুমেন্ট এর একটি উপাদান উত্পাদন করতে ।AccATT

Arities সংজ্ঞায়িত করা আবশ্যক: এখানে খুবই গুরুত্বপূর্ণ কিছু আগে আমরা সংজ্ঞায়িত Tবা অন্যথায় আমরা বলতে পারবো না কি কনস্ট্রাকটর কাজ করা অনুমিত হয়। কেউ যদি কনস্ট্রাক্টর রাখার চেষ্টা করে

broken: (T -> T) -> T

তাহলে প্রশ্ন "কত যুক্তি লাগে broken?" কোন ভাল উত্তর আছে। আপনি "এটি গ্রহণ করে-অনেক Tআর্গুমেন্ট" দিয়ে উত্তর দেওয়ার চেষ্টা করতে পারেন , তবে তা করবে না, কারণ Tএটি এখনও সংজ্ঞায়িত হয়নি। আমরা কোনও ধরণ Tএবং ইনজেকশন ফাংশন সন্ধানের জন্য অভিনব ফিক্সড পয়েন্ট থিওরিটি ব্যবহার করে কুনানড্রাম থেকে বেরিয়ে আসার চেষ্টা করতে পারি (T -> T) -> Tএবং সফল হতে পারি, তবে আমরা পথের জন্য অন্তর্ভুক্তির নীতিটিও ভেঙে দেব T। সুতরাং, এই জাতীয় জিনিস চেষ্টা করা খুব খারাপ ধারণা।

λবনামλবনামcB

c : B * (A -> T) -> T

প্রকৃতপক্ষে, অনেক কনস্ট্রাক্টরকে এভাবে নতুন করে লেখা যেতে পারে, তবে সবকটিই নয়, আমাদের আরও একটি পদক্ষেপ প্রয়োজন, যথা আমাদের উপর নির্ভরA করতে দেওয়া উচিত :B

c : (∑ (x : B), A x -> T) -> T

এটি একটি ইন্ডাকটিভ টাইপের জন্য কনস্ট্রাক্টরের চূড়ান্ত রূপ। ডাব্লু-টাইপ কী তাও ঠিক তা-ও বলা যায়। ফর্মটি এত সাধারণ যে আমাদের কেবলমাত্র একটি একক নির্মাণকারী প্রয়োজন c! সত্যই, যদি আমরা তাদের দুটি আছে

d' : (∑ (x : B'), A' x -> T) -> T
d'' : (∑ (x : B''), A'' x -> T) -> T

তারপরে আমরা এগুলিকে একটিতে সংযুক্ত করতে পারি

d : (∑ (x : B), A x -> T) -> T

কোথায়

B := B' + B''
A(inl x) := A' x
A(inr x) := A'' x

যাইহোক, যদি আমরা সাধারণ ফর্মটি কারি করি তবে আমরা দেখতে পাই এটি সমান

c : ∏ (x : B), ((A x -> T) -> T)

যা প্রকৃত সহকারীগুলিতে লোকেরা আসলে লিখে রাখে তার কাছাকাছি। প্রুফ অ্যাসিস্ট্যান্টগুলি আমাদের সুবিধামত উপায়ে কন্সট্রাক্টরগুলিকে লেখার অনুমতি দেয় তবে সেগুলি উপরের সাধারণ ফর্মের সমান (অনুশীলন!)।


1
আমার মধ্যাহ্নভোজের পরে আবার আন্দ্রেজকে ধন্যবাদ হজম করা আমার পক্ষে এটি সবচেয়ে কঠিন কাজ। চিয়ার্স।
পুষ্প

9

প্রথম ঘটনাটিকে Bad'নেতিবাচক' বলা হয় কারণ এটি একটি ফাংশন আর্গুমেন্টকে উপস্থাপন করে, অর্থাৎ ফাংশন তীরটির বাম দিকে অবস্থিত ( ফিলিপ ওয়েডলারের দ্বারা নিখরচায় পুনরাবৃত্ত প্রকারগুলি দেখুন )। আমি শব্দটি 'নেতিবাচক অবস্থানে' উৎপত্তি ধারণা থেকে ডালপালা contravariance ( 'বিরূদ্ধে' অর্থ বিপরীত)।

ধরণেরটিকে নেতিবাচক অবস্থানে সংজ্ঞায়িত করার অনুমতি দেওয়া হয় না কারণ এটির সাহায্যে কেউ নন-টার্মিনেটিং প্রোগ্রাম লিখতে পারে, অর্থাত্ দৃ normal় স্বাভাবিককরণ তার উপস্থিতিতে ব্যর্থ হয় (নীচে এটি আরও)) যাইহোক, এই নিয়মের নাম 'কঠোর ইতিবাচকতা' এর কারণ: আমরা নেতিবাচক অবস্থানগুলিকে অনুমতি দিই না।

আমরা দ্বিতীয় ঘটনার অনুমতি দিচ্ছি Badকারণ এটি অ-অবসান ঘটায় না এবং আমরা পুনরাবৃত্তির ডেটাটাইপের (এর নির্মাতার শেষ তীরের আগেBad ) এক পর্যায়ে সংজ্ঞায়িত ধরণটি ব্যবহার করতে চাই ।

এটি বুঝতে গুরুত্বপূর্ণ যে নিম্নলিখিত সংজ্ঞাটি কঠোর ইতিবাচক নিয়ম লঙ্ঘন করে না

data Good : Set where
  good : Good → Good → Good

বিধিটি কেবলমাত্র নির্মাণকারীদের যুক্তিগুলিতে প্রযোজ্য (যা উভয় Goodক্ষেত্রেই এটি) এবং নিজেই কোনও নির্মাণকারীর ক্ষেত্রে নয় (অ্যাডাম চ্লিপালার " নির্ভরযোগ্য প্রকারের সাথে প্রত্যয়িত প্রোগ্রামিং "ও দেখুন)।

কঠোর ইতিবাচকতা লঙ্ঘন করার আরেকটি উদাহরণ:

data Strange : Set where
  strange : ((Bool → Strange) → (ℕ → Strange)) → Strange
                       ^^     ^
            this Strange is   ...this arrow
            to the left of... 

আপনি এই উত্তরটি নেতিবাচক অবস্থানগুলি সম্পর্কে পরীক্ষা করতে চাইতে পারেন ।


অবসানহীনকরণ সম্পর্কিত আরও ... আপনার উল্লেখ করা পৃষ্ঠায় কয়েকটি ব্যাখ্যা রয়েছে (হাস্কেলের উদাহরণ সহ):

কঠোর-ইতিবাচক অ-ঘোষণাগুলি প্রত্যাখ্যান করা হয়েছে কারণ কেউ এগুলি ব্যবহার করে একটি নন-টার্মিনেশন ফাংশন লিখতে পারে। উপরে থেকে খারাপ ডেটাটাইপ ব্যবহার করে কীভাবে কোনও লুপিং সংজ্ঞা লিখতে পারে তা দেখতে, BadInHaskell দেখুন

এখানে ওকামেলের একটি সাদৃশ্যপূর্ণ উদাহরণ রয়েছে, যা দেখায় যে কীভাবে পুনরাবৃত্তি সরাসরি ব্যবহার করে (!) ছাড়াই পুনরাবৃত্ত আচরণ করা যায়:

type boxed_fun =
  | Box of (boxed_fun -> boxed_fun)

(* (!) in Ocaml the 'let' construct does not permit recursion;
   one have to use the 'let rec' construct to bring 
   the name of the function under definition into scope
*)
let nonTerminating (bf:boxed_fun) : boxed_fun =
  match bf with
    Box f -> f bf

let loop = nonTerminating (Box nonTerminating)

nonTerminatingফাংশন "unpacks" তার যুক্তি এবং আপেল এটা মূল যুক্তি থেকে একটি ফাংশন। এখানে গুরুত্বপূর্ণ বিষয়টি হ'ল বেশিরভাগ টাইপ সিস্টেমগুলি তাদের নিজের মধ্যে ফাংশনগুলি পাস করার অনুমতি দেয় না, সুতরাং f fটাইপচেকারকে fসন্তুষ্ট করার মতো কোনও শব্দ নেই বলে একটি শব্দটি টাইপচেক করবে না । টাইপ সিস্টেমগুলি চালু করার অন্যতম কারণ হ'ল স্ব-প্রয়োগ অক্ষম করা ( এখানে দেখুন )।

উপরের মতো আমাদের মোড়কের মতো মোড়াকির ডেটাটাইপগুলি অসামঞ্জস্যতার পথে এই রোডব্লকটি ছিন্ন করতে ব্যবহৃত হতে পারে।

আমি যুক্ত করতে চাই যে নন-টার্মিনেটিং কম্পিউটেশনগুলি লজিক সিস্টেমগুলিতে অসঙ্গতিগুলি প্রবর্তন করে। আগদা এবং কোকের ক্ষেত্রে প্রেরণামূলক Falseডেটাটাইপের কোনও কনস্ট্রাক্টর নেই, তাই আপনি কখনই মিথ্যা টাইপের প্রুফ টার্ম তৈরি করতে পারবেন না। তবে যদি নন-টার্মিনেটিং কম্পিউটেশনগুলির অনুমতি দেওয়া হয় তবে কেউ উদাহরণস্বরূপ এটি করতে পারেন (কোকায়):

Fixpoint loop (n : nat) : False = loop n

তারপরে loop 0টাইপচেক দিতেন loop 0 : False, সুতরাং কারি-হাওয়ার্ডের চিঠিপত্রের অধীনে এর অর্থ হবে আমরা একটি মিথ্যা প্রস্তাব প্রমাণ করেছি।

আপশট : প্রস্তাবনামূলক সংজ্ঞাগুলির জন্য কঠোর ইতিবাচক নিয়মটি অ-সমাপ্তি গণনাগুলিকে বাধা দেয় যা যুক্তির জন্য বিপর্যয়কর।


আমি এখন দ্বিধান্বিত. বিশেষভাবে ডেটা ভাল: সেট ভাল যেখানে: ভাল → ভাল →। আমরা বোঝার চেষ্টা করব এবং এক ঘন্টার মধ্যে ফিরে আসব /
পুষ্প

নিয়মটি কেবল কনস্ট্রাক্টরের ক্ষেত্রেই প্রযোজ্য নয়, কেবল তার যুক্তিগুলিতেই, অর্থাৎ কনস্ট্রাক্টরের সংজ্ঞার শীর্ষ স্তরের তীরগুলি গুরুত্বপূর্ণ নয়। আমি আরও একটি (পরোক্ষ) লঙ্ঘনকারী উদাহরণ যুক্ত করেছি।
আন্তন ট্রুনভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.