inductive Considérons la fonction suivanteIdris - preuve à l'étape
tryMove : (diskNumber : Nat) -> (from: Peg) -> (to: Peg)-> {default Oh prf: So (from /= to)} -> Disposition diskNumber -> Maybe (Disposition diskNumber)
tryMove Z from to [] = Nothing
tryMove (S k) from to (smallestDiskPosition :: restOfTheDisposition) =
map (smallestDiskPosition ::) (tryMove k from to restOfTheDisposition)
Essayer de compiler je reçois l'erreur suivante:
When checking argument prf to Hanoi.tryMove:
Type mismatch between
So True (Type of Oh)
and
So (from /= to) (Expected type)
Specifically:
Type mismatch between
True
and
not (Hanoi.Peg implementation of Prelude.Interfaces.Eq, method == from to)
sur l'invocation de recurvise de tryMove
. Si je passe comme dans {prf}
explicitement
tryMove : (diskNumber : Nat) -> (from: Peg) -> (to: Peg)-> {default Oh prf: So (from /= to)} -> Disposition diskNumber -> Maybe (Disposition diskNumber)
tryMove Z from to [] = Nothing
tryMove (S k) from to {prf} (smallestDiskPosition :: restOfTheDisposition) =
map (smallestDiskPosition ::) (tryMove k from to {prf} restOfTheDisposition)
Il compile correctement.
Pourquoi est-ce que Idris ne peut pas détecter automatiquement la preuve dans l'étape inductive, alors qu'il est capable de le faire dans une invocation normale de la fonction?
EDIT:
ici est un point essentiel complet à utiliser: https://gist.github.com/marcosh/d51479ea08e8522560713fd1e5ca9624
merci pour votre réponse. Je ne comprends pas une chose. Que voulez-vous dire par «puisque vous ne détruisez pas de et vers, Idris ne peut pas connaître la valeur de/= to'? 'from' et' to' restent identiques à l'appel initial. Si elles sont différentes au début, pourquoi Idris ne peut-il pas comprendre qu'elles sont différentes après? De plus, que voulez-vous dire par détruire 'to' et' from'? Comment pourrais-je faire ça? – marcosh
Vous passez 'Oh' de type' So True' où Idris attend une valeur de type 'So (de/= to)', Idris vous permettra de le faire tant que 'from/= to' et' True' sont définition égale, ou plus précise dans ce cas si 'from/= to' est évalué à' True'. Mais pour évaluer l'application de la fonction '(/ =)', vous devez savoir exactement ce que sont les deux arguments. Idris ne sait pas que 'from' et' to' ne sont pas égaux. L'appariement de motifs est la manière dont vous propagez l'information. Donc, une façon extrêmement moche d'aider Idris serait de faire correspondre pattern sur 'from' et' to' - cela générerait 9 clauses (dont 3 sont impossibles) –