কক-তে দুটি আর্গুমেন্টে কীভাবে একটি ফাংশন সংক্ষিপ্তভাবে परिभाषित করবেন?


14

আমি কীভাবে কাককে বোঝাতে পারি যে নীচে প্রদত্ত পুনরাবৃত্তির কাজটি সমাপ্ত হয়েছে? ফাংশন দুটি সূচক যুক্তি লাগে। স্বজ্ঞাতভাবে, পুনরাবৃত্তিটি সমাপ্ত হয় কারণ উভয় যুক্তির পচন হয়।

বিশেষত, ফাংশনটি দুটি গাছ ইনপুট হিসাবে নেয়।

Inductive Tree :=
| Tip: Tree
| Bin: Tree -> Tree -> Tree.

বৃক্ষগুলিতে, আমি নিম্নলিখিত শৈলীর অন্তর্ভুক্ত করতে পছন্দ করি।

Inductive TreePair :=
| TipTip : TreePair
| TipBin : Tree -> Tree -> TreePair
| BinTip : Tree -> Tree -> TreePair
| BinBin : TreePair -> TreePair -> TreePair.

Fixpoint pair (l r: Tree): TreePair :=
  match l with
    | Tip =>
      match r with
        | Tip => TipTip
        | Bin rl rr => TipBin rl rr
      end
    | Bin ll lr =>
      match r with
        | Tip => BinTip ll lr
        | Bin rl rr => BinBin (pair l rl) (pair lr r)
      end
  end.

ট্রিপিয়ার সংজ্ঞাটি গৃহীত হয় তবে ফাংশন জোড়ার সংজ্ঞা ত্রুটি বার্তা দেয়:

Error: Cannot guess decreasing argument of fix.

সুতরাং আমি কীভাবে সমাপ্তির বিষয়ে কাককে বোঝাতে আগ্রহী।


1
আপনি কি কারি ব্যবহারের পরিবর্তে পণ্য হিসাবে l এবং r একসাথে করার চেষ্টা করেছেন? এটি পাশাপাশি সাহায্য করা উচিত।
প্রতি ভোগেনসেন

1
কিছু লোক মনে করেন যে এই প্রশ্নটি এই ওয়েবসাইটটির প্রোগ্রামিং এবং এর আওতার বাইরে। আমি সম্মত কিনা তা সম্পর্কে নিশ্চিত না হলেও আপনি সম্ভাব্য সমস্যাটি সম্পর্কে জানতে চাইতে পারেন। কারও কাছে যদি যথাযথতা সম্পর্কে কিছু বলার থাকে তবে দয়া করে আমি যে মেটা আলোচনার সাথে লিঙ্ক করেছি তাতে লিখুন।
Tsuyoshi Ito

3
এই প্রশ্নটি অপারেশনটি pairসঠিকভাবে সংজ্ঞায়িত হয়েছে কিনা তা নিশ্চিত করার জন্য ডেটা স্ট্রাকচারের একচেটিয়াভাবে হ্রাসের সীমা নির্দিষ্টকরণ সম্পর্কে । কোক নিছক বাহন।
ডেভ ক্লার্ক

উত্তর:


12

ককের ফিক্সপয়েন্ট সংজ্ঞাগুলির জন্য প্রয়োজন যে প্রস্তাবনামূলক কলগুলি কাঠামোগতভাবে ছোট আর্গুমেন্ট পান। গভীর নিচে, একটি ফিক্সপয়েন্ট কনস্ট্রাক্ট একটি একক যুক্তি নেয়: দুটি আর্গুমেন্টের দ্বারা পুনরাবৃত্ত সংজ্ঞাটির কোনও বিল্ট-ইন ধারণা নেই। সৌভাগ্যক্রমে, কাঠামোগতভাবে ছোট সম্পর্কে ককের সংজ্ঞায় উচ্চ-অর্ডার ধরণের অন্তর্ভুক্ত রয়েছে, যা অত্যন্ত শক্তিশালী।

আপনার দ্বি-যুক্তির ফিক্সপয়েন্টের সংজ্ঞাটি একটি সাধারণ প্যাটার্ন অনুসরণ করে: হয় প্রথম যুক্তিটি ছোট হয়, বা প্রথম যুক্তিটি অভিন্ন থাকে এবং দ্বিতীয় যুক্তি আরও ছোট হয়। এই মোটামুটি সাধারণ প্যাটার্নটি একটি সাধারণ ফিক্স-ইন-ফিক্স দ্বারা পরিচালনা করা যায়।

Fixpoint pair l := fix pair1 (r : Tree) :=
  match l with
    | Tip => match r with
              | Tip => TipTip
              | Bin rl rr => TipBin rl rr
            end
    | Bin ll lr => match r with
                    | Tip => BinTip ll lr
                    | Bin rl rr => BinBin (pair1 rl) (pair lr r)
                   end
  end.

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


এখন আমি জানি এটিই আমি চেয়েছিলাম!
yhirai

যদি আমি fix pair1 rশীর্ষ-স্তরের দ্বিতীয় শাখায় ঠেলাঠেলি করি তবে কি কোনও ত্রুটি হবে?match (এবং অবশ্যই প্রথম শাখাটিকে সেই অনুসারে কোনও ফাংশন টাইপ ফিরিয়ে আনতে হবে)?
দিন

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