Просто не совпадайте с шаблоном на p x
:
predicate {A} {p} {xs = []} = all[]
predicate {A} {p} {x :: xs} with inspect (p x)
predicate {A} {p} {x :: xs} | it true pf rewrite pf = {!!}
predicate {A} {p} {x :: xs} | it false pf rewrite pf = {!!}
Обратите внимание, что идиома inspect
устарела. Используйте для проверки стероидов . Вы можете найти его в стандартной библиотеке здесь .
Ваш код становится
predicate : ∀ {A : Set} {p : A -> Bool } {xs : List A } ->
All (satisfies p) (filter p xs)
predicate {A} {p} {xs = []} = all[]
predicate {A} {p} {xs = x :: xs} with p x | inspect p x
predicate {A} {p} {x :: xs} | true | [ pf ] = {!!}
predicate {A} {p} {x :: xs} | false | [ pf ] = {!!}
, когда pf
находится в первом отверстии
.Data.Unit.Core.reveal (.Data.Unit.Core.hide p x) == true
, который бета-уменьшается до p x == true
. То есть если у вас есть
test : ∀ {A : Set} {p : A -> Bool} {x} -> p x == true -> True
test _ = _
, тогда размещение test {p = p} pf
в первом отверстии и ввод C-c C-d дает вам True
.