menerapkan daftar ke fungsi yang dimasukkan untuk memeriksa tautologi

Saya ingin menulis fungsi di haskell yang menentukan apakah fungsi boolean (dimasukkan dengan ekspresi lambda di ghci) adalah tautologi atau tidak. Masukannya akan terlihat seperti ini:

taut n (\[x..] -> ... == ...)

taut 3 (\[x,y,z] -> ((x||y)||z) == (x||(y||z)) )

Saya telah membuat semua kemungkinan kombinasi boolean dengan

combinations n = replicateM n [True,False] 

cmb n = concat (combinations n)

tapi sekarang saya memerlukan fungsi yang mengambil elemen daftar ini dan memasukkannya ke dalam n variabel di fungsi yang kemudian dimasukkan.

Terima kasih sebelumnya :)


person rsng    schedule 11.12.2011    source sumber
comment
Ini sebenarnya bukan pekerjaan rumah, ini tugas tambahan untuk modul di universitas...kita bisa melakukannya jika kita mau, tapi itu tidak wajib - tapi saya ingin melakukannya karena saya ingin setidaknya memahami haskell...   -  person rsng    schedule 11.12.2011


Jawaban (1)


Fungsi combinations Anda sudah menghasilkan daftar daftar dengan panjang n yang berisi semua kemungkinan permutasi True dan False. Anda tidak perlu menggunakan concat; hasilnya sudah mencakup semua kemungkinan entri ke fungsi Anda. Hal ini terjadi karena fungsi yang Anda periksa sudah mengharapkan daftar (dalam bentuk \[a,b,c...]).

Artinya, untuk fn yang mengambil daftar dengan panjang 3, combinations 3 akan menjadi:

[[True,True,True],[True,True,False],[True,False,True],[True,False,False],
 [False,True,True],[False,True,False],[False,False,True],[False,False,False]]

Setiap elemen daftar ini adalah daftar; Anda dapat meneruskannya ke fungsi yang Anda periksa (yang mungkin merupakan tautologi) secara langsung. Mengingat daftar di atas, yang harus Anda lakukan hanyalah mencoba setiap elemen.

EDIT (mencoba menjelaskan sedikit):

Anda menginginkan fungsi taut yang menggunakan fungsi lain bertipe [Bool] -> Bool dan menentukan apakah fungsi tersebut merupakan tautologi atau tidak. Artinya taut akan memiliki tipe seperti Int -> ([Bool] -> Bool) -> Bool. Katakanlah Anda memulainya seperti ini:

taut :: Int -> ([Bool] -> Bool) -> Bool
taut n fn = ...

Sekarang, n adalah panjangnya dan fn adalah fungsinya. Fungsi combinations Anda mengambil n dan mengembalikan setiap input valid yang mungkin ke fn. Perhatikan bahwa fn mengharapkan [Bool] dan combinations n adalah [[Bool]], yang berarti setiap elemen dapat menjadi masukan ke fn. Mengetahui hal ini, yang perlu Anda lakukan hanyalah menerapkan fn ke setiap elemen combinations n dan melihat apakah hasilnya selalu sama.

Dalam fungsi taut Anda, Anda tidak perlu khawatir tentang bagaimana variabel di dalam fungsi yang diuji ditugaskan. Saat Anda benar-benar menulis fungsi itu, jika dalam bentuk \[x,y,z]->..., x, y dan z akan ditugaskan di dalamnya berkat pencocokan pola.

person Tikhon Jelvis    schedule 11.12.2011
comment
Ya, saya sudah bertanya-tanya apakah saya benar-benar perlu memasukkannya ke dalam satu daftar, tapi saya pikir mungkin saya bisa menggunakan daftar ini dan entah bagaimana menghitung dan memasukkan nilai boolean ke dalam variabel...tapi di situlah masalahnya dimulai - Saya pikir saya mungkin mulai menguji bagaimana saya bisa memasukkan fungsi lambda ke dalam kode, jadi saya mengetik taut [x,y,z] = (\[x,y,z] -> ((x||y)||z) == (x||(y||z)) ) untuk melihat apakah saya bisa memasukkan nilai boolean untuk x,y,z , tetapi bahkan itu tidak memberi saya contoh..dari penggunaan kesalahan 'cetak' yang saya tidak begitu mengerti... - person rsng; 11.12.2011
comment
Saya sedikit bingung tentang bagaimana tepatnya Anda mengharapkan fungsi taut berfungsi. Saya pikir Anda ingin menggunakan lambda dan mencoba setiap kombinasi input. Apakah Anda berpikir untuk melakukannya dengan cara lain? Selain itu, taut di komentar Anda tampaknya sangat berbeda dari taut di pertanyaan Anda--yang pertama menggunakan angka dan fungsi; yang kedua sepertinya mengambil dua daftar (Int -› [Bool] -› Bool vs [Bool] -› [Bool] -› Bool). - person Tikhon Jelvis; 11.12.2011
comment
Kalimat kedua persis seperti yang saya inginkan agar berfungsi... fungsi kencang saya di komentar di atas hanyalah sebuah tes di mana saya dapat melihat bagaimana saya dapat memasukkan nilai untuk mendekati solusi - tetapi ternyata tidak berhasil lagi pula dan saya ragu Haskell bekerja seperti ini juga. - person rsng; 11.12.2011
comment
Benar. Saya akan mencoba memperjelas jawaban saya. - person Tikhon Jelvis; 11.12.2011
comment
Oh, dan mengenai kesalahan no instance... Anda: Anda mungkin mendapatkannya dengan mengetikkan nilai yang merupakan fungsi. Itu hanya berarti ghci tidak tahu cara mencetak nilai yang Anda berikan, dan tidak tahu cara mengubah fungsi menjadi string. - person Tikhon Jelvis; 11.12.2011
comment
Itu sangat membantu...Saya bahkan menemukan cara menerapkan argumen fungsi dalam parameter dengan mengingat matematika dasar saya sebelum saya melihat jawaban Anda...Saya rasa saya sekarang hampir mencapai solusi sebenarnya, saat saya menerapkan daftar boolean ke fungsi kencang saya dengan taut n fx = map fx(combinations n) - sekarang saya mendapatkan daftar [Benar, Benar..] dan saat ini saya sedang mencari cara untuk menggabungkannya menjadi 1 keluaran tunggal jika semuanya Benar. - person rsng; 11.12.2011
comment
dan selesai - taut n fx = and(map fx(combinations n)) berfungsi dengan sempurna. Melihat ke belakang semuanya tampak begitu sederhana :/ Saya sangat menghargai bantuan Anda, saya pikir ini membawa saya lebih jauh dalam mencari tahu apa yang saya lakukan - person rsng; 11.12.2011
comment
Senang mendengar Anda berhasil--tujuan saya adalah memberikan klarifikasi secukupnya agar Anda bisa mendapatkan jawabannya sendiri tanpa memberikannya begitu saja. Ini akan menjadi lebih sederhana setelah Anda menulis banyak program di Haskell. Catatan tentang gaya: Anda dapat mengganti tanda kurung dengan . dan $, sehingga Anda dapat memiliki taut n fx = and . map fn $ combinations n yang sedikit lebih mudah dibaca (menurut saya). - person Tikhon Jelvis; 11.12.2011