일부 Isabelle 술어를 삭제하기 위해 HOL-Z의 수학 툴킷을 사용하고 있습니다. 특히 나는 부분적인 함수 정의를 사용하여 필자가 작성한 Z 사양에서 관계의 일부를 정의하고있다. 여기서는 간단한 HOL 술어를 생성 할 수 있도록 스키마를 명세서로 변환한다. I 쓸 때 조건부 내에 다음은 Isabelle에서 두 개의 부분 함수가 같은 출력을 생성하지 않는다는 것을 보여주기위한 정의가 필요합니다.
type_synonym ('a,'b) lts = "('a*'b) set" (infixr "<=>" 20)
prodZ ::"['a set,'b set] => ('a <=> 'b) " ("_ %x _" [81,80] 80)
"a %x b" == "a <*> b"
rel ::"['a set, 'b set] => ('a <=> 'b) set" ("_ <--> _" [54,53] 53)
rel_def : "A <--> B == Pow (A %x B)"
partial_func ::"['a set,'b set] => ('a <=> 'b) set" ("_ -|-> _" [54,53] 53)
partial_func_def : "S -|-> R ==
{f. f:(S <--> R) & (! x y1 y2. (x,y1):f & (x,y2):f --> (y1=y2))}"
rel_appl :: "['a<=>'b,'a] => 'b" ("_ %^ _" [90,91] 90)
rel_appl_def : "R %^ x == (@y. (x,y) : R)"
HOL-Z 툴킷에서
정의 : 밸런스 Bbalance은 (Z)에서 두 부분 함수는
FORALL x. balance %^ x = Bbalance %^ x
, 폼 ('a < =>'b) 이사벨 (Isabelle)에서는 잘 동작한다고 가정합니다.
어떻게 두 개의 부분 함수가 모든 'x'에 대해 완전히 분리되어 있다고 다른 점을 정의 할 수 있습니까? 즉, 두 개의 부분 함수 'balance'와 'Bbalance'에 같은 값을 적용하면 절대 동일한 값을 산출하지 않습니다. 뭔가 ...
FORALL x. balance %^ x \noteq Bbalance %^ x
죄송합니다. 전문가의 조언을 통해 배웁니다. :).
실질적인 개정 수요일 년 11 월 27 일, 대부분 이사벨 (= G F) 증거 (F^g) <->에 당신을 허용하고, 이사벨도! (X 당신을 제공 할 것입니다.x : f = x : g) <-> (f = g). 하지만 (! x. (f %^x) = (g %^x)) <-> (f = g)에 대한 기회는별로 없습니다. –
사이드 노드와 마찬가지로 : 최신 버전의 이사벨에는 "partial_function"지시어도 있습니다 (http://stackoverflow.com/questions/25280566/how-to-define-a-partial-function-in-isabelle). 그러나 나는 현재 근본적인 메커니즘을 알지 못하며 그것이 가능한 다른 대안으로 구성 될지 여부를 모르고있다. –