Arthur's suggestion के बाद, मैंने अपने Fixpoint
को पारस्परिक Inductive
संबंध के संबंध में बदल दिया जो "ड्रिलिंग डाउन" के बजाय गेम के बीच अलग-अलग तुलना "बनाता है"।कोक परस्पर अपरिवर्तनीय प्रकारों को समान पैरामीटर क्यों होना चाहिए?
लेकिन अब मैं पूरी तरह से नया त्रुटि संदेश मिल रहा हूँ:
Error: Parameters should be syntactically the same for each inductive type.
मुझे लगता है कि त्रुटि संदेश कह रही है कि मैं इन आपसी आगमनात्मक परिभाषाओं के सभी के लिए एक ही सटीक मानकों की जरूरत है।
मुझे एहसास है कि इस के आसपास पाने के लिए सरल हैक्स (अप्रयुक्त डमी चर, forall
के अंदर सब कुछ के साथ लंबे कार्यात्मक प्रकार), लेकिन मुझे नहीं पता कि मुझे क्यों करना चाहिए।
क्या कोई आपसी अप्रत्यक्ष प्रकारों पर इस प्रतिबंध के पीछे तर्क को समझा सकता है? क्या यह लिखने का एक और शानदार तरीका है? क्या यह प्रतिबंध यह भी दर्शाता है कि एक-दूसरे के लिए अपरिवर्तनीय कॉल सभी एक ही पैरामीटर का उपयोग कर सकते हैं (इस मामले में मुझे किसी भी हैक के बारे में पता नहीं है जो कोड डुप्लिकेशन की भयानक मात्रा को बचाता है)?
(सभी प्रकार के और इस तरह के compare_quest, खेल, g1side आदि के रूप में शब्दों की परिभाषा क्या वे मेरी first question में थे से अपरिवर्तित रहे हैं।
Inductive gameCompare (c : compare_quest) : game -> game -> Prop :=
| igc : forall g1 g2 : game,
innerGCompare (nextCompare c) (compareCombiner c) (g1side c) (g2side c) g1 g2 ->
gameCompare c g1 g2
with innerGCompare (next_c : compare_quest) (cbn : combiner) (g1s g2s : side)
: game -> game -> Prop :=
| compBoth : forall g1 g2 : game,
cbn (listGameCompare next_c cbn (g1s g1) g2)
(gameListCompare next_c cbn g1 (g2s g2)) ->
innerGCompare next_c cbn g1s g2s g1 g2
with listGameCompare (c : compare_quest) (cbn : combiner) : gamelist -> game -> Prop :=
| emptylgCompare : cbn_init cbn -> forall g2 : game, listGameCompare c cbn emptylist g2
| otlgCompare : forall (g1_cdr : gamelist) (g1_car g2 : game),
(cbn (listGameCompare c cbn g1_cdr g2) (gameCompare c g1_car g2)) ->
listGameCompare c cbn (listCons g1_car g1_cdr) g2
with gameListCompare (c : compare_quest) (cbn : combiner) : game -> gamelist -> Prop :=
| emptyglCompare : cbn_init cbn -> forall g1 : game, gameListCompare c cbn g1 emptylist
| otglCompare : forall (g1 g2_car : game) (g2_cdr : gamelist),
(cbn (gameListCompare c cbn g1 g2_cdr) (gameCompare c g1 g2_car)) ->
gameListCompare c cbn g1 (listCons g2_car g2_cdr).
CGT में, आम तौर पर दो खिलाड़ियों (Left
और Right
नामित) एक खेल खेलना शुरू कर देता है जहां खिलाड़ी आखिरी कदम जीतता है। प्रत्येक गेम (जिसका अर्थ है खेल में प्रत्येक स्थिति) को Left
के विकल्पों के सेट के रूप में पढ़ा जा सकता है और के रूप में लिखे गए Right
के विकल्प के सेट के रूप में पढ़ा जा सकता है। दो गेम की तुलना में, वे चार अलग-अलग तरीकों से तुलना कर सकते हैं: <
, >
, =
, या ||
।
एक खेल A < B
है अगर B
सख्ती से Left
के लिए A
तुलना में बेहतर है, जो पहली बार चला जाता है की परवाह किए बिना। A > B
A
B
से Left
के लिए बेहतर है। A = B
यदि दो गेम समकक्ष हैं (इस अर्थ में कि गेम A + -B
का योग शून्य-गेम है ताकि खिलाड़ी जो पहले हार जाए)। और, A || B
यदि Left
के लिए कौन सा गेम बेहतर है तो यह निर्भर करता है कि पहले कौन जाता है। A
के सभी अगर सही बच्चों के Left
बच्चों <| B
और A <|
B
के सभी कर रहे हैं '
A <= B
: दो मैचों के बीच तुलना की जाँच करने केएक तरह से इस प्रकार है।
A <| B
A
एक सही बच्चे जो<= B
या यदिA <=
B
के बाईं बच्चों के किसी भी रखता है।और इसी तरह
>=
और>|
के लिए।
तो, तो देखकर जो इन संबंधों की जोड़ी दो मैचों A
और B
पर लागू होते हैं, यह निर्धारित करने के लिए संभव है कि क्या A < B
(A<=B
और A<|B
), A=B
(A<=B
और A>=B
), A > B
(A>=B
और A>|B
) , या A || B
(A<|B
और A>|B
)।
यहां wiki article on CGT है।
धन्यवाद, यह जानना अच्छा है। मुझे समस्या दिखाई देती है और मुझे पता है कि इससे कैसे छुटकारा पाना है (हालांकि कुछ कोड डुप्लिकेशंस के बिना नहीं)। मैंने दो सीजीटी गेम की तुलना करने के लिए इसका क्या अर्थ है इसका विवरण जोड़ा है। यदि आपके पास उससे कोई अन्य विचार है। धन्यवाद फिर से – dspyz
वाह, यह सीजीटी सामान वास्तव में अच्छा है! अधिक विस्तार से इसे थोड़ा सा समझाए जाने के लिए धन्यवाद। मैंने एक [gist] पोस्ट किया है (https://gist.github.com/arthuraa/5882759) उसमें से कुछ कोक में विकसित करना, शायद यह आपकी मदद करेगा! –