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