Wednesday, November 16, 2011

مصارعة الثيران

لو أتفرجت قبل كدة على مصارعة التيران حتلاقي حاجة مثيرة للأهتمام، المصارع مش عاوز التور يضربه، فبيهز الوشاح الأحمر بحيث التور يهاجم الوشاح مش المصارع، والمصارع بيبقى حاطط الوشاح بطريقة أنه لو التور ضرب الوشاح مش حتيجي الضربة في المصارع. وده هدفه الأصلي، لأن التور كدة كدة حيضرب حاجة، فتيجي في الوشاح أحسن ما تيجي فيه هو.

نفس الفكرة ديه بتفكرني بحاجات بتحصل اليومين دول. تخيلوا أن المصارع هو "نقل السلطة في ابريل 2012 مش في 2013" وأن الوشاح هو "وثيقة السلمي الحاكمة للدستور". اللي حط الوثيقة ديه مش ساذج عشان يستفز الناس بوضوح النوايا اللي تسمح للجيش بالحصول على مزايا مش من حقه. لكن حاول تحط نفسك مكانهم وشوف التفكير بيمشي أزاي:

أ- شوف يا برنس، احنا حنحط وثيقة فيها مزايا جامدة لينا
ب- بس كدة الشعب حيزعل مننا
أ- مهو بص هو احتمال من أتنين، يا أما الشعب حيزعل يا أما حيعديها، لو عداها يبقى قشطة
ب- ولو زعل ؟
أ- لو زعل يبقى حنخيرهم يا أما يحشدوا عشان نقل السلطة، يا أما عشان الوثيقة
ب- أزاي ؟
أ- بسيطة، لو حشدوا عشان نقل السلطة لأنها أهم من الوثيقة يبقى الوثيقة ممكن تعدي من غير حشد أوي
ب- طب ولو العكس ؟
أ- لو العكس يبقى خلاص نتنازل عن شوية مزايا من المزايا الجامدة اللي كدة كدة كنا عارفين اننا مش حناخدها والشعب حينام مبسوط فاكر أنه ضرب المصارع بس هو ضرب الوشاح بس

نفس الأسلوب ده بيتكرر في حاجات تانية، بس لو ركزت وفكرت فيهم. يعني مثلا في موضوع قضية الفلول، اللي حصل انه تم تخييرنا بين (1) تطبيق الحكم والتخلص من الفلول بس تأجيل الانتخابات أو (2) نمشي الأنتخابات حتى لو فيها فلول بسس متتأجلش. وكدة برضه عمل اللي هو عاوزة، ومش بس كدة، لأ كمان بقى أسمه طلع الحكم اللي كان مطلوب منه بعزل الفلول بس أحنا اللي رفضنا نطبقه... 

الفكرة العامة هي أنك تخير الشعب بين خيارين، والأتنين في مصلحتك في الآخر، وده ممكن لسببين، والسببين الوقت عامل حاسم فيهم

1- الاختيارين وحشين جدا، والشعب رافض الأتنين، بس مش حيقدر يحشد ضد الاتنين في نفس الجمعة، وعلى ما تيجي الجمعة اللي بعدها يبقى الموضوع أمر واقع وتبات نار تصبح رماد.
2- يا أما برضه حطيت الشعب قدام الأمر الواقع والشعب عارف أنه لازم يختار واحده، دبسته يعني خلاص وسبق السيف العزل، بس الشعب مش عارف يختار مين، فبرضه مش حيقدر يحشد.

السبب الأول شايفينه في موضوع وثيقة السلمي، والسبب الثاني في موضوع قضية الفلول. وفي أمثلة تانية لو دورت.

وفي مشكلة أساسية، المجلس جهاز منظم، قادر على أتباع استراتيجية واضحة طويلة المدى، يعني لو وثيقة الجمل فشلت حيعيدها بشكل تاني في السلمي لما الشعب يهدى ألخ. لكن الشعب على العكس مش منظم وملوش منظور بعيد المدى وبيتعامل مع المعطيات الوقتية على أساس أنها آخر الدنيا، وبالتالي من الممكن مساومته على خيارات بنظام بالونة الاختبار، يا تنجح ويبقى قشطة يا تفشل وينسى، وتتعاد بعدها برضه بكام شهر لحد ما تنجح. عشان نعرف المجلس رايح فين وناوي على ايه مينفعش نبص على المتغيرات الوقتية بس، لازم نبص على افعالهم من ساعة ما مسكوا الحكم ونحاول نستخلص استراتيجيتهم، يعني نبص لما وراء الأفعال.

Currying with Mathematica

The ad hoc way:


Curry[f_[x__]] := f[x, ##] & 
a[x_, y_, z_] := {x, y, z} 
b = Curry[a[x]]; 
c = Curry[b[y]]; 

then  a[x, y, z] is the same as b[y, z] is the same as c[z].

The neat and fully automated way:


ClearAll[UnPattern];
ClearAll[MakeFunction]
ClearAll[CurriedDefinitions]
ClearAll[MyHold]
ClearAll[MyHold2]
ClearAll[CurryableSetDelayed]
SetAttributes[UnPattern,HoldAllComplete];
SetAttributes[MakeFunction,HoldAllComplete];
SetAttributes[CurriedDefinitions,HoldAllComplete]
SetAttributes[MyHold,HoldAllComplete]
SetAttributes[MyHold2,HoldAllComplete]
SetAttributes[CurryableSetDelayed,HoldAllComplete]
UnPattern[x_]:=Block[{pattern},MyHold[x]/. Pattern->pattern/. pattern[v_,_]:>v]
MakeFunction[param_,body_,attrs_]:=With[{p=UnPattern[param],b=UnPattern[body]},
  Block[{function},MyHold[function[p,b,attrs]]/. function->Function]]
CurriedDefinitions[fname_[args__],body_,attrs_]:=MapThread[MyHold2[#1:=#2]&,
  {Rest[(MyHold[fname]@@#1&)/@NestList[Drop[#1,-1]&,{args},Length[{args}]-1]],
   Rest[FoldList[MakeFunction[#2,MyHold[#1],Evaluate[attrs]]&,MyHold[fname[args]],
     Reverse[Drop[{args},1]]]]}]
CurryableSetDelayed[fname_[args__],body_]:={MyHold2[fname[args]:=body],
  Sequence@@CurriedDefinitions[fname[args],body,Attributes[fname]]}
  //. MyHold[x_]:>x/. MyHold2[x_]:>x

This way all you need to do is :

CurryableSetDelayed[f[a_, b_, c_], {c, b, a}]

and then you can call f in any of the following ways:
 f[1, 2, 3]
f[1, 2][3]
f[1][2][3]