In a world where trusting software systems is problematic, formal methods and formal proofs should be able to help. Proof checking can play an important role in establishing trust since such checkers can be smaller and easier to verify than, for example, entire theorem provers or model checkers. Proof checking has played an important role in the history of programming languages and, I argue, in its future. In general, proof checkers rely on programming languages which must also be trusted. In many modern proof checkers and theorem provers, that programming language is a functional programming language, often a variant of ML. In fact, parts of ML (eg., strong typing, abstract datatypes, and higher-order programming) were designed to make ML into a trustworthy metalanguage for the finding and checking proofs in LCF [2] . While there is considerable overlap in the foundations of logic programming and proof checking (both benefit from unification, backtracking search, efficient term structures, etc), the discipline of logic programming has, in fact, played a minor role in the history of proof checking, in particular, and theorem proving, in general. I will argue that logic programming can have a major role in the future of proof checking, especially when logic programming embraces more logical principles than what is found in first-order Horn clauses. I will survey the results of a multi-year project where we are developing the foundational proof certificate framework [1, 3, 4] that allows for the formal definition of a wide range of proof evidence in both classical and intuitionistic first-order logics. Such formal definitions can then be checked by simple proof checkers written in, for example, the λProlog programming language [5] .
λProlog REF provides a general proof-checking framework that allows nondeterminism, enabling flexible combinations of proof search and proof checking.