TRIZ,Haskell和功能性思维

在TRIZ一词中,人们经常回想起“理想的系统是不存在的系统(并且其功能得以实现)”这一论点。 就像没有出现在办公室的好管理员一样,但是一切正常。


功能和系统是TRIZ中的关键概念,它们甚至谈到了功能性思维方式。 的确,用这些话,我个人立即与函数式编程语言相关联。


让我们尝试看一下TRIZ的功能思维概念如何在Haskell(一种通用的纯功能语言)上有机地显示出来。



功能介绍


功能 -通过功能载体(“工具”) 更改功能对象(“产品”) 属性的模型。


工具是我们要做的工作,即 我们正在改变某些东西。 通常,需要改进或创建它。 因此,函数的载体通常在有关它的所有TRIZ自变量中用单词“系统”来表示。


产品就是我们用工具改变(加工)的东西。



主要功能是消费者财产,因此创建了一个技术系统。


函数本身通常由一个简单的动词定义,以反映过程的本质(不是一个特殊的术语,以免干扰思维的惯性),函数的载体和对象都包含在表述中。


例如:锤子移动钉子; 扫帚移动垃圾; 杯子里放咖啡; 真空吸尘器移动灰尘; 燃料使火箭运动。


特别考虑一杯咖啡。
一杯咖啡。
功能(工具)的载体是杯子,功能的对象是咖啡,功能是握持。



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

保持功能必须是多态的,因为杯子不仅可以容纳咖啡,而且咖啡不仅可以倒入杯子中:


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

工具和产品可以更改,并且其交互的本质(按功能表示)保持不变。 据统计,技术系统要素之间的大多数配对功能可以用三个打动词来描述(移动,保持,加热,吸收,通知等)。 从Haskell实现的角度来看,它们每个都是多态函数。 但是,就像自然语言的其余动词一样。


反函数


在现实世界中,总是存在相反的功能-产品在乐器上的作用(没有人取消牛顿的第三定律)。



例如,正在处理的金属会使钻头变钝,粗心的学生会累坏老师,文件会减少可用磁盘空间。
在咖啡的例子中,他加热并弄脏了杯子。



通常,反函数会损害我们的利益(工具磨损,额外成本),但在其他情况下,我们可以从中受益。 例如,在凉爽的房间里,将手放在温暖的杯子上。


 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 

用Haskell录制非常接近用自然语言录制。


与链条相反的方向:咖啡加热杯子,杯子加热碟,碟装手。


 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"] 

最后我们得到


第一层->保留-​​>第二层->保留-​​>第三层

实现的递归性并没有在任何地方消失,而是具有建设性,并且没有被无意义的困扰。


通过列表的卷积,可以简单地写出相同的内容:


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

结论


技术系统作为将其统一起来并确定TRIZ的本质和目的的功能结构的愿景与TRIZ的功能编程语言极为相关,其中功能是主要的控制结构。


考虑的方法在分解问题和控制模型的复杂性方面是一个很好的帮助。

Source: https://habr.com/ru/post/zh-CN414929/


All Articles