Logic programming that computational steps cannot be logically deduced. However, in concurrent logic programming, any result of a terminating computation is a logical consequence of the program, and any partial result of a partial computation is a logical consequence of the program and the residual goal (process network). Consequently, the indeterminacy of computations implies that not all logical consequences of the program can be deduced. Concurrent constraint logic programming combines concurrent logic programming and constraint logic programming, using constraints to control concurrency. A clause can contain a guard, which is a set of constraints that may block the applicability of the clause.
Is Logic Empirical? in just the same way as he argues the principle of bivalence is. To grasp why, consider why truth tables work for classical logic: first, it must be the case that the variable parts of the proposition are either true or false: if they could be other values, or fail to have truth values at all, then the truth table analysis of logical connectives would not exhaust the possible ways these could be applied. For example intuitionistic logic respects the classical truth tables, but not the laws of classical logic, because intuitionistic logic allows propositions to be other than true