Pada kata TRIZ, orang sering mengingat tesis "sistem yang ideal adalah yang tidak ada (dan fungsinya terpenuhi)." Seperti admin yang baik yang tidak muncul di kantor, tetapi semuanya berfungsi dengan baik.
Fungsi dan sistem adalah konsep penting dalam TRIZ, mereka bahkan berbicara tentang gaya berpikir fungsional. Benar, dengan kata-kata ini, saya pribadi langsung mengaitkannya dengan bahasa pemrograman fungsional.
Mari kita coba melihat bagaimana secara organik ide-ide pemikiran fungsional TRIZ ditampilkan pada Haskell, salah satu bahasa fungsional murni dari tujuan umum.

Fungsi
Fungsi - model untuk mengubah properti objek fungsi ("produk") oleh pembawa fungsi ("alat").
Alat adalah sesuatu yang dengannya kita melakukan beberapa pekerjaan, mis. Kami mengubah sesuatu. Sebagai aturan, itu yang perlu diperbaiki atau dibuat. Dengan demikian, itu adalah pembawa fungsi yang biasanya dimaksud dengan kata "sistem" di semua argumen TRIZ tentang hal itu.
Suatu produk adalah apa yang kita ubah (proses) dengan alat.

Fungsi utama adalah properti konsumen, untuk itu sistem teknis dibuat.
Fungsi itu sendiri biasanya didefinisikan oleh kata kerja sederhana, yang mencerminkan esensi proses (bukan istilah khusus, agar tidak mengganggu inersia pemikiran), pembawa dan objek fungsi dimasukkan dalam formulasi.
Misalnya: palu menggerakkan paku; sapu memindahkan sampah; mug memegang kopi; penyedot debu memindahkan debu; bahan bakar menggerakkan roket.
Pertimbangkan secangkir kopi.
Secangkir memegang kopi.
Pembawa fungsi (alat) adalah gelas, objek fungsinya adalah kopi, fungsinya adalah untuk memegang.

-- -- , - hold :: Cup -> Coffee -> Coffee -- hold - "" cup `hold` coffee
Fungsi tahan harus polimorfik, karena cangkir dapat menampung tidak hanya kopi dan kopi dapat dituangkan tidak hanya ke dalam cangkir:
-- b, b hold :: a -> b -> b -- , thermos `hold` coffee -- , shirt `hold` coffee
Alat dan produk dapat berubah, dan esensi interaksi mereka, yang diungkapkan oleh fungsi, tetap sama. Menurut statistik, sebagian besar fungsi pasangan antara elemen sistem teknis dapat dijelaskan oleh tiga lusin kata kerja (memindahkan, menahan, memanaskan, menyerap, menginformasikan, dll.). Masing-masing dari sudut pandang implementasi Haskell adalah fungsi polimorfik. Namun, sebagai sisa dari kata kerja bahasa alami.
Fungsi terbalik
Di dunia nyata, selalu ada fungsi yang berlawanan - tindakan produk pada instrumen (tidak ada yang membatalkan hukum ketiga Newton).

Misalnya, logam yang sedang diproses menumpulkan bor, seorang siswa yang ceroboh membuat gurunya lelah, dan file tersebut mengurangi ruang disk kosong.
Dalam contoh kopi, dia memanaskan dan mengotori cangkir.

Sebagai aturan, fungsi terbalik merugikan kita (keausan pahat, biaya tambahan), tetapi dalam situasi lain kita bisa mendapat manfaat darinya. Misalnya, hangatkan tangan Anda di cangkir hangat saat berada di ruangan yang dingin.
hold:: a -> b -> b warm :: a -> b -> b cup `hold` coffee coffee `warm` cup
Rantai Fungsi
Dalam kasus ketika jumlah elemen sistem lebih dari dua (yaitu, pada kenyataannya, selalu) mereka dianggap berpasangan, menerima rantai fungsi.
Sebagai contoh, pada gambar di bawah ini, tangan membawa (memindahkan) nampan dengan cangkir, nampan memegang cangkir, dan cangkir memegang kopi.

((arm `move` wrist) `hold` cup) `hold` coffee
Hapus tanda kurung dengan menentukan asosiasi kiri
infixl 9 hold arm `move` wrist `hold` cup `hold` coffee
Merekam di Haskell sangat dekat dengan rekaman dalam bahasa alami.
Dan rantai ke arah yang berlawanan: kopi memanaskan cawan, cawan memanaskan cawan, cawan memuat tangan.
infixl 9 warm, weight coffee `warm` cup `warm` wrist `weight` arm
Memahami fungsi utama dan interaksi antar elemen memungkinkan Anda untuk secara optimal memilih batas-batas sistem, hanya memasukkan apa yang diperlukan untuk menyelesaikan tugas target (tanpa kehilangan apa pun) dan tidak mempersulit model di luar apa yang diperlukan.
Sistem yang tidak ada ...
Kami membutuhkan fungsi, atau lebih tepatnya hasil dari penerapannya, dan alat itu sendiri tidak diperlukan. Ini adalah barang habis pakai, hanya tertarik oleh kebutuhan.
Kopi dapat dipegang oleh cezve, teko, termos, piring dan meja dan kemeja (jika kopi tidak sengaja tumpah).
Kami bahkan tidak keberatan jika kopi itu sendiri. Bagaimana ini terjadi, misalnya, dengan air dalam gravitasi nol di stasiun ruang angkasa.

Namun, tidak lazim untuk memikirkan formulasi melingkar seperti "kopi memegang kopi" di TRIZ, karena tidak berguna dari sudut pandang praktis - itu tidak memberikan informasi tentang unsur-unsur yang dengannya hasil dicapai.
Dari sudut pandang pemrograman, formulasi rekursif seperti itu buruk karena tidak ada syarat untuk mengakhiri rekursi.
Hal ini diperlukan untuk masuk lebih dalam dan menunjukkan bagian mana (subsistem) menyediakan pemenuhan fungsi.
Cairan mengasumsikan bentuk kompak dalam gravitasi nol karena gaya tegangan permukaan. T.O. deskripsi situasi yang lebih tepat adalah: lapisan permukaan memegang volume internal kopi.
Anda dapat membayangkan seluruh volume kopi sebagai matryoshka dari lapisan, yang masing-masing memegang satu sama lain. Dalam hal ini, pekerjaan utama dilakukan oleh lapisan luar.

-- - , - let coffee = [layer1, layer2, layer3, layer4, layer5] head coffee `hold` tail coffee
Namun, jika penting bagi kita bahwa lapisan-lapisan tersebut saling mempengaruhi (misalnya, dalam hal penyerapan cahaya),
seseorang dapat menciptakan sepeda dan menggambarkan interaksi berurutan secara eksplisit.
Sifat rekursif dari fenomena tersebut dipertahankan, tetapi dengan memahami interkoneksi dari subsistem, kita dapat mengatur kondisi untuk keluar dari rekursi dan mengubahnya menjadi layanan kami.

-- "", 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"]
pada akhirnya kita dapatkan
Layer1 -> Hold -> Layer2 -> Hold -> Layer3
Kekambuhan implementasi tidak hilang di mana pun, tetapi telah menjadi konstruktif, dan tidak terobsesi dengan makna yang tidak berarti.
Hal yang sama dapat ditulis secara singkat, melalui lilitan daftar:
foldl1 hold ["Layer1","Layer2","Layer3"]
Kesimpulan
Visi sistem teknis sebagai jalinan fungsi yang menyatukannya dan menentukan esensi dan tujuan TRIZ sangat terkait dengan TRIZ dengan bahasa pemrograman fungsional, di mana fungsi merupakan struktur kontrol utama.
Pendekatan yang dipertimbangkan adalah bantuan yang baik dalam hal menguraikan masalah dan mengendalikan kompleksitas model.