我是 Prolog 和一般逻辑编程的新手,我正在编写一个小定理证明器来取乐,并在这样做的过程中编写了一个规范化程序。我希望这个过程是确定性和坚定的,所以我写了这样的东西:
normal(S, R):- var(S), !, S = R.
normal(true(S), R):- !, normal(S, R).
normal(!(S), R):- !, normal(false(S), R).
normal(P => Q, R):- !, normal(false(P and false(Q)), R).
normal(A or B, R):- !, normal(false(false(A) and false(B)), R).
normal(false(S), R):- !, normal(S, NS), normal_false(NS, R).
normal(A and B, R):- !, normal(A, NA), normal(B, NB), normal_and(NA, NB, R).
normal(S, S):- !.
normal_false(S, R):- var(S), !, S = false(R).
normal_false(false(S), S):- !.
normal_false(true, false):- !.
normal_false(false, true):- !.
normal_false(S, false(S)):- !.
normal_and(A, B, R):- var(A), var(B), !, R = A and B.
normal_and(A, true, A):- !.
normal_and(true, B, B):- !.
normal_and(_, false, false):- !.
normal_and(false, _, false):- !.
normal_and(A, B, A and B):- !.
我现在想知道这是否是正确的方法。它目前似乎可以工作,但我想知道这是否不符合我在某些极端情况下所期望的属性,我编写它的方式是否可能存在一些性能问题,或者这只是糟糕的编码风格/一般练习。