تريز ، هاسكل والتفكير الوظيفي

في كلمة تريز ، غالبًا ما يتذكر المرء الأطروحة "النظام المثالي هو نظام غير موجود (ويتم أداء وظيفته)". مثل المشرف الجيد الذي لا يظهر في المكتب ، لكن كل شيء يعمل بشكل صحيح.


الوظيفة والنظام مفاهيم حاسمة في تريز ، حتى أنهم يتحدثون عن أسلوب تفكير وظيفي. صحيح ، بهذه الكلمات ، أربط شخصيًا على الفور بلغات البرمجة الوظيفية.


دعونا نحاول أن نرى كيف يتم عرض أفكار التفكير الوظيفي لـ TRIZ على Haskell ، وهي واحدة من اللغات الوظيفية الخالصة للأغراض العامة.



الوظيفة


الوظيفة - نموذج لتغيير خاصية كائن دالة ("المنتج") بواسطة ناقل دالة ("أداة").


الأداة هي شيء نقوم به ببعض العمل ، أي نحن نغير شيئا. كقاعدة ، هو الذي يحتاج إلى تحسين أو إنشاء. وبناءً على ذلك ، فإن ناقل الوظيفة هو المقصود عادةً بكلمة "نظام" في جميع حجج TRIZ حولها.


المنتج هو ما نغيره (العملية) بأداة.



الوظيفة الرئيسية هي خاصية المستهلك ، والتي من أجلها يتم إنشاء نظام تقني.


عادة ما يتم تعريف الوظيفة نفسها بفعل بسيط ، يعكس جوهر العملية (وليس مصطلحًا خاصًا ، حتى لا تتداخل مع القصور الذاتي في التفكير) ، يتم تضمين الناقل والهدف من الوظيفة في الصيغة.


على سبيل المثال: المطرقة تحرك المسمار. مكنسة تتحرك القمامة. الكوب يحمل القهوة. تعمل المكنسة الكهربائية على تحريك الغبار ؛ الوقود يحرك الصاروخ.


خذ بعين الاعتبار ، على وجه الخصوص ، فنجان قهوة.
فنجان يحمل قهوة.
حامل الوظيفة (الأداة) هو كوب ، والهدف من الوظيفة هو القهوة ، والوظيفة هي الاحتفاظ بها.



--        -- ,       -  hold :: Cup -> Coffee -> Coffee --   hold - ""         cup `hold` coffee 

يجب أن تكون وظيفة الحفظ متعددة الأشكال ، لأن الكوب يمكن أن يحمل ليس فقط القهوة ويمكن صب القهوة ليس فقط في الكوب:


 --        b,      b hold :: a -> b -> b --  ,      thermos `hold` coffee --  ,      shirt `hold` coffee 

يمكن للأداة والمنتج أن يتغير ، ويظل جوهر تفاعلهما ، المعبر عنه بالوظيفة ، كما هو. وفقًا للإحصاءات ، يمكن وصف معظم الوظائف الزوجية بين عناصر الأنظمة التقنية بثلاث عشرات من الأفعال (الحركة ، الإمساك ، الحرارة ، الامتصاص ، الإخطار ، إلخ). كل واحد منهم من وجهة نظر تنفيذ هاسكل هو دالة متعددة الأشكال. كما ، مع ذلك ، بقية أفعال اللغة الطبيعية.


دالة عكسية


في العالم الواقعي ، هناك دائمًا وظيفة معاكسة - إجراء المنتج على الأداة (لم يقم أحد بإلغاء قانون نيوتن الثالث).



على سبيل المثال ، المعدن الذي تتم معالجته يضعف التدريبات ، ويلعب الطالب المتهوّر المدرس ، ويقلل الملف من مساحة القرص الحرة.
في مثال القهوة ، يسخن الكوب ويلطخه.



كقاعدة ، تؤذينا الوظيفة العكسية (ارتداء الأدوات ، والتكاليف الإضافية) ، ولكن في حالات أخرى يمكننا الاستفادة منها. على سبيل المثال ، قم بتدفئة يديك على كوب دافئ أثناء وجودك في غرفة باردة.


 hold:: a -> b -> b warm :: a -> b -> b cup `hold` coffee coffee `warm` cup 

سلاسل الوظائف


في الحالة التي يكون فيها عدد عناصر النظام أكثر من عنصرين (أي في الواقع ، دائمًا) يتم اعتبارهم في أزواج ، يتلقون سلاسل من الوظائف.


على سبيل المثال ، في الشكل أدناه ، تحمل اليد (تحرك) صينية مع كوب ، وصينية تحمل كوبًا ، وكوب يحمل قهوة.



 ((arm `move` wrist) `hold` cup) `hold` coffee 

قم بإزالة الأقواس عن طريق تحديد الجمعية اليسرى


 infixl 9 hold arm `move` wrist `hold` cup `hold` coffee 

التسجيل في هاسكل قريب جدًا من التسجيل باللغة الطبيعية.


والسلسلة في الاتجاه المعاكس: القهوة تسخن الكأس ، الكوب يسخن الصحن ، الصحن يحمل اليد.


 infixl 9 warm, weight coffee `warm` cup `warm` wrist `weight` arm 

يسمح لك فهم الوظيفة الرئيسية والتفاعلات بين العناصر باختيار حدود النظام على النحو الأمثل ، وإدراج ما هو مطلوب فقط لإكمال المهمة المستهدفة (دون فقدان أي شيء) وعدم تعقيد النموذج بما يتجاوز ما هو ضروري.


نظام غير موجود ...


نحن بحاجة إلى وظيفة ، أو بالأحرى نتيجة تطبيقها ، والأداة نفسها ليست مطلوبة. هذا مستهلك ، يجذبه الضرورة فقط.


يمكن الاحتفاظ بالقهوة بواسطة cezve ، إبريق الشاي ، الترمس ، الصحن والطاولة والقميص (إذا انسكبت القهوة عن غير قصد).


لن نمانع حتى إذا احتفظت القهوة نفسها بنفسها. كيف يحدث هذا ، على سبيل المثال ، مع الماء في انعدام الجاذبية في محطة فضائية.



ومع ذلك ، ليس من المعتاد التركيز على التركيبات الحلزونية مثل "القهوة تحمل القهوة" في TRIZ ، نظرًا لأنها غير مجدية من وجهة نظر عملية - فهي لا توفر معلومات حول العناصر التي يتم من خلالها تحقيق النتيجة.


من وجهة نظر البرمجة ، هذه الصيغة العودية سيئة في عدم وجود شرط لإنهاء العودية.


من الضروري التعمق أكثر وتحديد الأجزاء (الأنظمة الفرعية) التي توفر أداء الوظيفة.


يفترض السائل شكلًا مضغوطًا في انعدام الجاذبية بسبب قوى التوتر السطحي. T.O. قد يكون الوصف الأكثر ملاءمة للموقف: الطبقة السطحية تحتفظ بالحجم الداخلي للقهوة.


يمكنك أن تتخيل الحجم الكامل للقهوة كطبقات ماتريوشكا ، كل منها يحمل بعضها البعض. في هذه الحالة ، يتم تنفيذ العمل الرئيسي بواسطة الطبقة الخارجية.



 --    - ,  -   let coffee = [layer1, layer2, layer3, layer4, layer5] head coffee `hold` tail coffee 

ومع ذلك ، إذا كان من المهم بالنسبة لنا أن تؤثر الطبقات على بعضها البعض (على سبيل المثال ، من حيث امتصاص الضوء) ،
يمكن للمرء أن يخترع دراجة ويصف التفاعلات المتسلسلة بشكل صريح.


يتم الحفاظ على الطبيعة العودية للظاهرة ، ولكن من خلال فهم الترابط بين الأنظمة الفرعية ، يمكننا تحديد شروط الخروج من العودية وتحويلها إلى خدمتنا.



 --  "",      hold :: String -> String -> String hold tool "" = tool hold tool workpiece = tool ++ " -> holds -> " ++ workpiece --  " ". --        --     "" --       selfHold :: [String] -> String selfHold [] = "" selfHold (x:xs) = x `hold` selfHold xs --     selfHold ["Layer1","Layer2","Layer3"] 

في النهاية نحصل


Layer1 -> Hold -> Layer2 -> Hold -> Layer3

لم يختف تكرارية التطبيق في أي مكان ، بل أصبح بناءًا وغير مهووس بلا معنى.


يمكن كتابة نفس الشيء باختصار ، من خلال تشكيل القائمة:


 foldl1 hold ["Layer1","Layer2","Layer3"] 

الخلاصة


ترتبط رؤية النظام التقني كنسيج من الوظائف التي توحده وتحدد جوهر وغرض TRIZ ارتباطًا وثيقًا بـ TRIZ مع لغات البرمجة الوظيفية ، حيث تكون الوظيفة هي هيكل التحكم الرئيسي.


يعتبر النهج المدروس مساعدة جيدة من حيث تحليل المشكلة والتحكم في تعقيد النموذج.

Source: https://habr.com/ru/post/ar414929/


All Articles