import Ġkotlin . math . log 2 Ċ Ċ @ Suppress (" Data Class Private Constructor ") Ċ data Ġclass ĠTr uth Table Ġprivate Ġconstructor ( ĊĠĠĠ Ġval Ġname : ĠChar , ĊĠĠĠ Ġprivate Ġval Ġvar Names : ĠList < Char >, ĊĠĠĠ Ġprivate Ġval Ġvector : ĠString , ĊĠĠĠ Ġprivate Ġval Ġtable : ĠList < Pair < List < Boolean >, ĠBoolean >> Ċ ) Ġ{ ĊĠĠĠ Ġ// ĠÐ¢ Ð°Ð±Ð»Ð¸ÑĨ Ð° ĠÐ¸ ÑģÑĤ Ð¸Ð½ Ð½Ð¾ÑģÑĤÐ¸ ĠÑģÐ¾Ð·Ð´ Ð°ÐµÑĤÑģÑı ĠÑĩ ÐµÑĢ ÐµÐ· ĠÑĦÑĥÐ½Ðº ÑĨÐ¸ Ñİ Ġbuild ĊĠĠĠ Ġ// ĠÐŁ ÐµÑĢ ÐµÐ´ Ð°Ð¹ ÑĤÐµ ĠÐ± Ñĥ Ð» ÐµÐ² ĠÐ² ÐµÐºÑĤ Ð¾ÑĢ ĠÐ¸Ð»Ð¸ ĠÐ» Ð¾Ð³ Ð¸ÑĩÐµÑģ Ðº ÑĥÑİ ĠÑĦ ÑĥÐ½ ÑĨ ÐºÐ¸ Ñİ ĠÐ´Ð»Ñı Ġ 2 Ñħ , Ġ 3 Ñħ ĠÐ¸Ð»Ð¸ Ġ 4 Ñħ ĠÐ¿ÐµÑĢ ÐµÐ¼ ÐµÐ½ Ð½ÑĭÑħ . ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠÐ¡ Ð¾Ð·Ð´ Ð°ÐµÑĤ Ġ[ Truth Table ] ĠÐ¸Ð· ĠÐ± Ñĥ Ð» ÐµÐ² Ð¾Ð³Ð¾ ĠÐ² ÐµÐºÑĤ Ð¾ÑĢ Ð° ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġname ĠÐ¸Ð¼ Ñı ĠÐ´Ð»Ñı ĠÐ» Ð¾Ð³ Ð¸ÑĩÐµÑģ Ðº Ð¾Ð¹ ĠÑĦÑĥÐ½Ðº ÑĨÐ¸Ð¸ ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġvar Names Ġ[ List ] ĠÐ¸Ð¼ ÐµÐ½Ð° ĠÐ´Ð»Ñı ĠÐ¿ÐµÑĢ ÐµÐ¼ ÐµÐ½ Ð½ÑĭÑħ ĠÑĤ Ð°Ð±Ð»Ð¸ÑĨ Ñĭ ĠÐ¸ ÑģÑĤ Ð¸Ð½ Ð½Ð¾ÑģÑĤÐ¸ Ġ( Ð½ ÑĥÐ¶ Ð½Ñĭ ĠÐ´Ð»Ñı ĠÐµ Ðµ ĠÐ²Ñĭ Ð² Ð¾Ð´Ð° ). ĠÐŁ ÑĢ Ð¸Ð¼ÐµÑĢ : Ġx , Ġy , Ġz , Ġ... ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġfn ĠÐ» Ð¾Ð³ Ð¸ÑĩÐµÑģ ÐºÐ° Ñı ĠÑĦÑĥÐ½Ðº ÑĨÐ¸Ñı ĠÑģ Ġ 2 ĠÐ¿Ð°ÑĢÐ°Ð¼ÐµÑĤ ÑĢÐ°Ð¼ Ð¸ ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġbuild ( name : ĠChar , Ġvar Names : ĠList < Char >, Ġfn : Ġ( Boolean , ĠBoolean ) Ġ-> ĠBoolean ): ĠTr uth Table Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġvector Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtable Ġ= Ġcart esian Product ( set Of ( false , Ġtrue ), Ġ 2 ). map Ġ{ Ġvars Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfn Val Ġ= Ġfn ( vars [ 0 ], Ġvars [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvector Ġ+= Ġif Ġ( fn Val ) Ġ" 1 " Ġelse Ġ" 0 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvars Ġto Ġfn Val ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTr uth Table ( name , Ġvar Names , Ġvector , Ġtable ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠÐ¡ Ð¾Ð·Ð´ Ð°ÐµÑĤ Ġ[ Truth Table ] ĠÐ¸Ð· ĠÐ± Ñĥ Ð» ÐµÐ² Ð¾Ð³Ð¾ ĠÐ² ÐµÐºÑĤ Ð¾ÑĢ Ð° ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġname ĠÐ¸Ð¼ Ñı ĠÐ´Ð»Ñı ĠÐ» Ð¾Ð³ Ð¸ÑĩÐµÑģ Ðº Ð¾Ð¹ ĠÑĦÑĥÐ½Ðº ÑĨÐ¸Ð¸ ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġvar Names Ġ[ List ] ĠÐ¸Ð¼ ÐµÐ½Ð° ĠÐ´Ð»Ñı ĠÐ¿ÐµÑĢ ÐµÐ¼ ÐµÐ½ Ð½ÑĭÑħ ĠÑĤ Ð°Ð±Ð»Ð¸ÑĨ Ñĭ ĠÐ¸ ÑģÑĤ Ð¸Ð½ Ð½Ð¾ÑģÑĤÐ¸ Ġ( Ð½ ÑĥÐ¶ Ð½Ñĭ ĠÐ´Ð»Ñı ĠÐµ Ðµ ĠÐ²Ñĭ Ð² Ð¾Ð´Ð° ). ĠÐŁ ÑĢ Ð¸Ð¼ÐµÑĢ : Ġx , Ġy , Ġz , Ġ... ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġfn ĠÐ» Ð¾Ð³ Ð¸ÑĩÐµÑģ ÐºÐ° Ñı ĠÑĦÑĥÐ½Ðº ÑĨÐ¸Ñı ĠÑģ Ġ 3 ĠÐ¿Ð°ÑĢÐ°Ð¼ÐµÑĤ ÑĢÐ°Ð¼ Ð¸ ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġbuild ( name : ĠChar , Ġvar Names : ĠList < Char >, Ġfn : Ġ( Boolean , ĠBoolean , ĠBoolean ) Ġ-> ĠBoolean ): ĠTr uth Table Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġvector Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtable Ġ= Ġcart esian Product ( set Of ( false , Ġtrue ), Ġ 3 ). map Ġ{ Ġvars Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfn Val Ġ= Ġfn ( vars [ 0 ], Ġvars [ 1 ], Ġvars [ 2 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvector Ġ+= Ġif Ġ( fn Val ) Ġ" 1 " Ġelse Ġ" 0 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvars Ġto Ġfn Val ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTr uth Table ( name , Ġvar Names , Ġvector , Ġtable ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠÐ¡ Ð¾Ð·Ð´ Ð°ÐµÑĤ Ġ[ Truth Table ] ĠÐ¸Ð· ĠÐ± Ñĥ Ð» ÐµÐ² Ð¾Ð³Ð¾ ĠÐ² ÐµÐºÑĤ Ð¾ÑĢ Ð° ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġname ĠÐ¸Ð¼ Ñı ĠÐ´Ð»Ñı ĠÐ» Ð¾Ð³ Ð¸ÑĩÐµÑģ Ðº Ð¾Ð¹ ĠÑĦÑĥÐ½Ðº ÑĨÐ¸Ð¸ ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġvar Names Ġ[ List ] ĠÐ¸Ð¼ ÐµÐ½Ð° ĠÐ´Ð»Ñı ĠÐ¿ÐµÑĢ ÐµÐ¼ ÐµÐ½ Ð½ÑĭÑħ ĠÑĤ Ð°Ð±Ð»Ð¸ÑĨ Ñĭ ĠÐ¸ ÑģÑĤ Ð¸Ð½ Ð½Ð¾ÑģÑĤÐ¸ Ġ( Ð½ ÑĥÐ¶ Ð½Ñĭ ĠÐ´Ð»Ñı ĠÐµ Ðµ ĠÐ²Ñĭ Ð² Ð¾Ð´Ð° ). ĠÐŁ ÑĢ Ð¸Ð¼ÐµÑĢ : Ġx , Ġy , Ġz , Ġ... ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġfn ĠÐ» Ð¾Ð³ Ð¸ÑĩÐµÑģ ÐºÐ° Ñı ĠÑĦÑĥÐ½Ðº ÑĨÐ¸Ñı ĠÑģ Ġ 4 ĠÐ¿Ð°ÑĢÐ°Ð¼ÐµÑĤ ÑĢÐ°Ð¼ Ð¸ ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġbuild ( name : ĠChar , Ġvar Names : ĠList < Char >, Ġfn : Ġ( Boolean , ĠBoolean , ĠBoolean , ĠBoolean ) Ġ-> ĠBoolean ): ĠTr uth Table Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġvector Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtable Ġ= Ġcart esian Product ( set Of ( false , Ġtrue ), Ġ 4 ). map Ġ{ Ġvars Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfn Val Ġ= Ġfn ( vars [ 0 ], Ġvars [ 1 ], Ġvars [ 2 ], Ġvars [ 3 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvector Ġ+= Ġif Ġ( fn Val ) Ġ" 1 " Ġelse Ġ" 0 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvars Ġto Ġfn Val ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTr uth Table ( name , Ġvar Names , Ġvector , Ġtable ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠÐ¡ Ð¾Ð·Ð´ Ð°ÐµÑĤ Ġ[ Truth Table ] ĠÐ¸Ð· ĠÐ± Ñĥ Ð» ÐµÐ² Ð¾Ð³Ð¾ ĠÐ² ÐµÐºÑĤ Ð¾ÑĢ Ð° ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġname ĠÐ¸Ð¼ Ñı ĠÐ´Ð»Ñı ĠÐ» Ð¾Ð³ Ð¸ÑĩÐµÑģ Ðº Ð¾Ð¹ ĠÑĦÑĥÐ½Ðº ÑĨÐ¸Ð¸ ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġvar Names Ġ[ List ] ĠÐ¸Ð¼ ÐµÐ½Ð° ĠÐ´Ð»Ñı ĠÐ¿ÐµÑĢ ÐµÐ¼ ÐµÐ½ Ð½ÑĭÑħ ĠÑĤ Ð°Ð±Ð»Ð¸ÑĨ Ñĭ ĠÐ¸ ÑģÑĤ Ð¸Ð½ Ð½Ð¾ÑģÑĤÐ¸ Ġ( Ð½ ÑĥÐ¶ Ð½Ñĭ ĠÐ´Ð»Ñı ĠÐµ Ðµ ĠÐ²Ñĭ Ð² Ð¾Ð´Ð° ). ĠÐŁ ÑĢ Ð¸Ð¼ÐµÑĢ : Ġx , Ġy , Ġz , Ġ... ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġvector ĠÐ± Ñĥ Ð» ÐµÐ² ĠÐ² ÐµÐºÑĤ Ð¾ÑĢ . ĠÐŁ ÑĢ Ð¸Ð¼ÐµÑĢ : Ġ" 1 0 0 0 1 1 1 1 ". ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġbuild ( name : ĠChar , Ġvar Names : ĠList < Char >, Ġvector : ĠString ): ĠTr uth Table Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Power Of Two Ġ= Ġ( vector . length ) Ġand Ġ( vector . length Ġ- Ġ 1 ) Ġ== Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Power Of Two Ġ&& Ġvector . length Ġ>= Ġ 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrepeat Ġ= Ġlog 2 ( vector . length . toDouble ()). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtable Ġ= Ġcart esian Product ( set Of ( false , Ġtrue ), Ġrepeat ). map Indexed Ġ{ Ġindex , Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġto Ġvector [ index ]. to Boolean () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTr uth Table ( name , Ġvar Names , Ġvector , Ġtable ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠThrowable (" ÐĿ ÐµÐ»ÑĮ Ð· Ñı ĠÑģÐ¾Ð·Ð´ Ð°ÑĤÑĮ ĠÑĤ Ð°Ð±Ð»Ð¸ÑĨ Ñĥ ĠÐ¸ ÑģÑĤ Ð¸Ð½ Ð½Ð¾ÑģÑĤÐ¸ ĠÐ´Ð»Ñı ĠÐ´Ð°Ð½ Ð½Ð¾Ð³Ð¾ ĠÐ² ÐµÐºÑĤ Ð¾ÑĢ Ð° . ĠÐŁ ÑĢÐ¾Ð² ÐµÑĢ ÑĮ ÑĤÐµ ĠÐµÐ³Ð¾ ĠÐ´ Ð»Ð¸ Ð½ Ñĥ ĠÐ½Ð° ĠÐº Ð¾ÑĢ ÑĢ ÐµÐºÑĤ Ð½Ð¾ÑģÑĤÑĮ .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠÐĴ ÑĭÐ² Ð¾Ð´ Ð¸ÑĤ ĠÐ² Ð· Ð° Ð¸Ð¼ Ð½Ð¾Ðµ ĠÑĢÐ°Ñģ Ð¿ Ð¾Ð» Ð¾Ð¶ ÐµÐ½Ð¸Ðµ ĠÐ¼ Ð½ Ð¾Ð¶ ÐµÑģÑĤÐ² Ġ( Ñı Ð²Ð»Ñı ÐµÑĤÑģÑı ĠÐ» Ð¸ ĠÐ¿Ð¾Ð´ Ð¼ Ð½ Ð¾Ð¶ ÐµÑģÑĤÐ² Ð¾Ð¼ , ĠÑĢÐ°Ð ² Ð½Ñĭ ĠÐ» Ð¸ ĠÐ¿ Ð¾Ð¶ Ð¼ Ð½ Ð¾Ð¶ ÐµÑģÑĤÐ² Ð° ) ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġprint Sub sets Equality ( tables : ĠList < Truth Table >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcart esian Product ( tables , Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit [ 0 ]. name Ġ!= Ġit [ 1 ]. name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it [ 0 ] Ġ== Ġit [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("${ it [ 0 ]. name } ĠâĬ Ĩ Ġ${ it [ 1 ]. name }") Ġ// Ġfirst ĠâĬ Ĥ Ġsecond Ġand Ġfirst Ġ= Ġsecond ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( it [ 0 ]. is Subset Of ( it [ 1 ])) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("${ it [ 0 ]. name } ĠâĬ Ĥ Ġ${ it [ 1 ]. name }") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ((" ${ it [ 0 ]. name } ĠâĬ Ħ Ġ${ it [ 1 ]. name } ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( other ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTr uth Table Ġ-> Ġthis . table Ġ== Ġother . table ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠString Ġ-> Ġthis . name Ġ== Ġother ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ= Ġsuper . hashCode () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠÐĴ ÑĭÐ² Ð¾Ð´ Ð¸ÑĤ ĠÐ¡ ÐĶ ÐĿ Ð¤ Ġ( Ð¡ Ð¾Ð²ÐµÑĢ ÑĪ ÐµÐ½ Ð½Ð°Ñı ĠÐĶ Ð¸Ð· ÑĬ Ñİ Ð½ Ðº ÑĤ Ð¸Ð² Ð½Ð°Ñı ĠÐĿ Ð¾ÑĢÐ¼ Ð°Ð»ÑĮ Ð½Ð°Ñı ĠÐ ¤ Ð¾ÑĢÐ¼ Ð° ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġperfect Dis j unct ive Normal Form () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpd nf Ġ= Ġthis . table . fold ("") Ġ{ Ġacc , Ġ( vars , Ġfn Val ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fn Val ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġacc Ġ+ Ġvars . map Indexed Ġ{ Ġindex , Ġit Ġ-> Ġif Ġ( it ) Ġthis . var Names [ index ] Ġelse Ġ" Â ¬ ${ this . var Names [ index ]}" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString ( separator Ġ= Ġ" Ġ& Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. wrap With Br ackets () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. plus (" Ġâĭ ģ Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġacc ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( p dn f . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Ð¡ ÐĶ ÐĿ Ð¤ : Ġ${ p dn f . drop Last ( 2 )} ") ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Ð¡ ÐĶ ÐĿ Ð¤ : ĠÐ½Ðµ ĠÑģ ÑĥÑī ÐµÑģÑĤÐ² ÑĥÐµÑĤ ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠÐĴ ÑĭÐ² Ð¾Ð´ Ð¸ÑĤ ĠÐ¡ Ðļ ÐĿ Ð¤ Ġ( Ð¡ Ð¾Ð²ÐµÑĢ ÑĪ ÐµÐ½ Ð½Ð°Ñı ĠÐļ Ð¾Ð½ ÑĬ Ñİ Ð½ Ðº ÑĤ Ð¸Ð² Ð½Ð°Ñı ĠÐĿ Ð¾ÑĢÐ¼ Ð°Ð»ÑĮ Ð½Ð°Ñı ĠÐ ¤ Ð¾ÑĢÐ¼ Ð° ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġperfect Con j unct ive Normal Form () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġp cnf Ġ= Ġthis . table . fold ("") Ġ{ Ġacc , Ġ( vars , Ġfn Val ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! fn Val ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġacc Ġ+ Ġvars . map Indexed Ġ{ Ġindex , Ġit Ġ-> Ġif Ġ(! it ) Ġthis . var Names [ index ] Ġelse Ġ" Â ¬ ${ this . var Names [ index ]}" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString ( separator Ġ= Ġ" Ġâĭ ģ Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. wrap With Br ackets () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. plus (" Ġ& Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġacc ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( pc nf . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Ð¡ Ðļ ÐĿ Ð¤ : Ġ${ pc nf . drop Last ( 2 )} ") ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Ð¡ Ðļ ÐĿ Ð¤ : ĠÐ½Ðµ ĠÑģ ÑĥÑī ÐµÑģÑĤÐ² ÑĥÐµÑĤ ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠÐĴ ÑĭÐ² Ð¾Ð´ Ð¸ÑĤ ĠÐ¿Ð¾Ð» Ð¸Ð½ Ð¾Ð¼ ĠÐ¶ ÐµÐ³ Ð°Ð» ÐºÐ¸ Ð½Ð° ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġpol yn om Z he g alk in () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtriangle Ġ= Ġcreate Empty Table ( this . table . size ) Ġ// ĠÐ¡ Ð¾Ð· Ð´Ð° ÐµÐ¼ ĠÐ¿ ÑĥÑģÑĤ ÑĥÑİ ĠÑĤ Ð°Ð±Ð»Ð¸ÑĨ Ñĥ ĊĠĠĠĠĠĠĠ Ġthis . table . forEach Indexed Ġ{ Ġindex , Ġ(_, Ġfn Val ) Ġ-> Ġtriangle [ index ]. add ( fn Val ) Ġ} Ġ// ĠÐ´Ð¾Ð±Ð°Ð² Ð»Ñı ÐµÐ¼ ĠÐ² ĠÐµ Ðµ ĠÐ¿ÐµÑĢ Ð² ÑĭÐ¹ ĠÑģÑĤ Ð¾Ð» Ð± Ðµ ÑĨ ĠÐ·Ð½Ð°Ñĩ ÐµÐ½Ð¸Ñı ĠÑĦÑĥÐ½Ðº ÑĨÐ¸ Ð¹ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 Ġuntil Ġthis . table . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġthis . table . indices ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( j Ġ+ Ġi ) Ġ< Ġthis . table . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtriangle [ j ]. add ( triangle [ j ][ i Ġ- Ġ 1 ] Ġxor Ġtriangle [ j Ġ+ Ġ 1 ][ i Ġ- Ġ 1 ]) Ġ// ĠÐ²Ñĭ Ñĩ Ð¸Ñģ Ð»Ñı ÐµÐ¼ ĠÐ·Ð½Ð°Ñĩ ÐµÐ½Ð¸Ñı ĠÑįÐ»ÐµÐ¼ÐµÐ½ÑĤ Ð¾Ð² ĠÐ¾Ñģ Ð½Ð¾Ð² ÑĭÐ² Ð°Ñı Ñģ ÑĮ ĠÐ½Ð° ĠÐ¿ÑĢÐµÐ´ Ñĭ Ð´Ñĥ ÑīÐ¸ Ñħ ĠÐ´Ð² Ñĥ Ñħ ĊĠĠĠĠĠĠĠ Ġ// ĠÐ¸Ð· Ð² Ð» ÐµÐº Ð°ÐµÐ¼ ĠÐ¿ÐµÑĢ Ð² ÑĥÑİ ĠÑģÑĤÑĢÐ¾Ðº Ñĥ ĠÑĤÑĢ Ðµ Ñĥ Ð³ Ð¾Ð»ÑĮ Ð½Ð¸ ÐºÐ° Ġ( Ñį ÑĤÐ¾ ĠÐ·Ð½Ð°Ñĩ ÐµÐ½Ð¸Ñı ĠÑĦÑĥÐ½Ðº ÑĨÐ¸Ð¸ ĠÐ´Ð»Ñı ĠÑĤ Ð°Ð±Ð»Ð¸ÑĨ Ñĭ ) ĊĠĠĠĠĠĠĠ Ġval Ġvector Ġ= Ġtriangle . first (). join ToString ( separator Ġ= Ġ"") Ġ{ Ġit . toInt (). toString () Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠÑģ Ð¾Ð· Ð´Ð° ÐµÐ¼ ĠÑĤ Ð°Ð±Ð»Ð¸ÑĨ Ñĥ ĠÐ¿Ð¾ ĠÐ² ÐµÐºÑĤ Ð¾ÑĢ Ñĥ ĠÐ¸ ĠÑģ Ð¾Ð± Ð¸ ÑĢÐ° ÐµÐ¼ ĠÐ¿Ð¾Ð» Ð¸Ð½ Ð¾Ð¼ ĠÐ¿Ð¾ ĠÐ·Ð½Ð°Ñĩ ÐµÐ½Ð¸Ñı Ð¼ ĠÐ¿ÐµÑĢ ÐµÐ¼ ÐµÐ½ Ð½ÑĭÑħ ĊĠĠĠĠĠĠĠ Ġval Ġpol yn om Ġ= Ġbuild ('_ ', Ġthis . var Names , Ġvector ). table . fold ("") Ġ{ Ġacc , Ġ( vars , Ġfn Val ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fn Val ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( vars . all Ġ{ Ġ! it Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġacc Ġ+ Ġ" 1 ĠâĬ ķ Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġacc Ġ+ Ġvars . map Indexed Ġ{ Ġindex , Ġit Ġ-> Ġthis . var Names [ index ] Ġto Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġ(_, Ġit ) Ġ-> Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString ( separator Ġ= Ġ" Ġ& Ġ") Ġ{ Ġ( name , Ġ_) Ġ-> Ġname . toString () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. wrap With Br ackets () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. plus (" ĠâĬ ķ Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġacc ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( pol yn om . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" ÐŁ Ð¾Ð» Ð¸Ð½ Ð¾Ð¼ ĠÐ ĸ ÐµÐ³ Ð°Ð» ÐºÐ¸ Ð½Ð° : Ġ${ pol yn om . drop Last ( 2 )} ") ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" ÐŁ Ð¾Ð» Ð¸Ð½ Ð¾Ð¼ ĠÐ ĸ ÐµÐ³ Ð°Ð» ÐºÐ¸ Ð½Ð° : Ġ 0 ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠÐŁ ÑĢÐ¾Ð² ÐµÑĢ Ñı ÐµÑĤ ĠÑı Ð²Ð»Ñı ÐµÑĤÑģÑı ĠÐ» Ð¸ ĠÐ´Ð°Ð½ Ð½ÑĭÐ¹ ĠÐ± Ñĥ Ð» ÐµÐ² ĠÐ² ÐµÐºÑĤ Ð¾ÑĢ ĠÐ¿Ð¾Ð´ Ð¼ Ð½ Ð¾Ð¶ ÐµÑģÑĤ Ð¾Ð¼ ĠÐ´ÑĢÑĥÐ³ Ð¾Ð³Ð¾ ĠÐ± Ñĥ Ð» ÐµÐ² Ð¾Ð³Ð¾ ĠÐ² ÐµÐºÑĤ Ð¾ÑĢ Ð° ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis Subset Of ( other : ĠTr uth Table ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . vector . length Ġ== Ġother . vector . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . table . forEach Indexed Ġ{ Ġindex , Ġ( vars , Ġfn Val ) Ġ-> Ġif Ġ( fn Val Ġ&& Ġ! other . table [ index ]. second ) Ġreturn Ġfalse Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠThrowable (" ÐĿ ÐµÐ»ÑĮ Ð· Ñı ĠÐ¿ÑĢ Ð¾Ð²ÐµÑĢ Ð¸ÑĤÑĮ ĠÐ´Ð² Ð° ĠÑĢÐ°Ð· Ð½ÑĭÑħ ĠÐ¿Ð¾ ĠÐ´ Ð»Ð¸ Ð½Ðµ ĠÐ² ÐµÐºÑĤ Ð¾ÑĢ Ð° !") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠÐĴ ÑĭÐ² Ð¾Ð´ Ð¸ÑĤ ĠÐ½Ð° ĠÑįÐº ÑĢÐ°Ð½ ĠÐ± Ñĥ Ð» ÐµÐ² ĠÐ² ÐµÐºÑĤ Ð¾ÑĢ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġprint Vector () Ġ{ ĊĠĠĠĠĠĠĠ Ġprint ("${ this . name } Ġ= Ġ") ĊĠĠĠĠĠĠĠ Ġprintln ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . vector ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. split ("") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġ!= Ġ"" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString ( prefix Ġ= Ġ" (", Ġpostfix Ġ= Ġ") ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠÐĴ ÑĭÐ² Ð¾Ð´ Ð¸ÑĤ ĠÑĤ Ð°Ð±Ð»Ð¸ÑĨ Ñĥ ĠÐ¸ ÑģÑĤ Ð¸Ð½ Ð½Ð¾ÑģÑĤÐ¸ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġprint Table () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprint Divider Ġ= Ġ{ Ġprintln ("+ --- ". repeat ( this . var Names . size Ġ+ Ġ 1 ). plus ("+ ")) Ġ} ĊĊĠĠĠĠĠĠĠ Ġprint Divider () ĊĠĠĠĠĠĠĠ Ġprintln ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . var Names . join ToString ( separator Ġ= Ġ" Ġ| Ġ", Ġprefix Ġ= Ġ"| Ġ", Ġpostfix Ġ= Ġ" Ġ| Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. plus ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. plus (" Ġ| ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġprint Divider () ĊĠĠĠĠĠĠĠ Ġthis . table . forEach Ġ{ Ġ( vars , Ġfn Val ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvars . map ( Boolean :: toInt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString ( separator Ġ= Ġ" Ġ| Ġ", Ġprefix Ġ= Ġ"| Ġ", Ġpostfix Ġ= Ġ" Ġ| Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. plus ( fn Val . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. plus (" Ġ| ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprint Divider () ĊĠĠĠ Ġ} Ċ }