Ltac Forall_pTree_from_elements :=
cbv beta;
unfold PTree.elements; simpl PTree.xelements;
go_lower;
repeat (( simple apply derives_extract_prop
|| simple apply derives_extract_prop');
fancy_intros true);
autorewrite with gather_prop;
repeat (( simple apply derives_extract_prop
|| simple apply derives_extract_prop');
fancy_intros true);
repeat erewrite unfold_reptype_elim in * by reflexivity;
try autorewrite with entailer_rewrite in *;
repeat first
[ apply prop_Forall_cons1;
[unfold check_one_temp_spec, check_gvars_spec;
simpl; auto;
solve [normalize]
| ]
| apply prop_Forall_cons'
| apply prop_Forall_cons
| apply prop_Forall_nil'
| apply prop_Forall_nil
];
unfold check_one_temp_spec; simpl PTree.get.

Lemma exp_uncurry3:
forall {T} {ND: NatDed T} A B C D F,
@exp T ND A (fun a => @exp T ND B (fun b => @exp T ND C
(fun c => @exp T ND D (fun d => F a b c d))))
= @exp T ND (A*B*C*D)
(fun x => F (fst (fst (fst x))) (snd (fst (fst x))) (snd (fst x)) (snd x)).