Prolog 子句化序言错误
我在PROLOG中有一个将FBF函数转换为CNF函数的项目,其中fbf2cnf是更改函数的谓词 当我运行此指令时:Prolog 子句化序言错误,prolog,Prolog,我在PROLOG中有一个将FBF函数转换为CNF函数的项目,其中fbf2cnf是更改函数的谓词 当我运行此指令时: fbf2cnf(every(X, exist(Y, foo(Y, X))), F). 。。。它抛出以下错误: ERROR: =../2: Type error: `atomic' expected, found `foo(skf1(_G1758),_G1758)' (a compound) Exception: (7) fbf2cnf(every(_G1558, exist(_G
fbf2cnf(every(X, exist(Y, foo(Y, X))), F).
。。。它抛出以下错误:
ERROR: =../2: Type error: `atomic' expected, found `foo(skf1(_G1758),_G1758)' (a compound)
Exception: (7) fbf2cnf(every(_G1558, exist(_G1557, foo(_G1557, _G1558))), _G1567) ?
如何避免抛出此异常
代码如下:
exist(V, FBF) :-
compound(FBF),
skolem_function([], SK),
exist_private(V, SK, [FBF], [], _),
V = SK.
exist_private(V, SK, [H | []], NL, Final) :-
variabile(H),
H == V,
append([SK], NL, NL2),
Final = NL2, !.
exist_private(V, SK, [H | T], NL, Final) :-
variabile(H),
H == V,
exist_private(V, SK, T, NL, F2),
append([SK], F2, NL2),
Final = NL2, !.
exist_private(_, _, [H | []], NL, Final) :-
termine(H),
append([H], NL, NL2),
Final = NL2, !.
exist_private(_, _, [H | T], NL, Final) :-
termine(H),
exist_private(_, _, T, NL, F2),
append([H], F2, NL2),
Final = NL2, !.
exist_private(V, SK, [H | []], _, Final) :-
compound(H),
H =.. [H1 | L],
exist_private(V, SK, L, [], F2),
append([H1], F2, NH),
FH =.. NH,
append([FH], [], NL2),
Final = NL2, !.
exist_private(V, SK, [H | T], NL, Final) :-
compound(H),
H =.. [H1 | L],
exist_private(V, SK, L, [], F2),
append([H1], F2, NH),
FH =.. NH,
exist_private(V, SK, T, NL, F3),
append([FH], F3, NL2),
Final = NL2, !.
fbf2cnf(FBF, CNFFBF) :-
termine(FBF),
CNFFBF = FBF, !.
fbf2cnf(FBF, CNFFBF) :-
predicato(FBF),
FBF =.. [H | T],
H \= not,
H \= and,
H \= or,
H \= implies,
H \= exist,
H \= every,
T \=[],
valid_fbf(FBF),
CNFFBF = FBF ,!.
fbf2cnf(FBF, CNFFBF) :-
compound(FBF),
FBF =.. [H | _],
H \= exist,
valid_fbf(FBF),
fbf2cnf_private([FBF], N),
CNFFBF = N, !.
fbf2cnf(FBF, CNFFBF) :-
compound(FBF),
FBF =.. [H | T],
H = exist,
T = [V | T2],
NFBF =.. T2,
fbf2cnf(NFBF, FBF2),
FBF2 =.. L,
skolem_function([], SK),
exist_private(V, SK, L, [], F),
V = SK,
Final =.. F,
fbf2cnf(Final, CNF),
CNFFBF = CNF, !.
fbf2cnf(FBF, CNFFBF) :-
compound(FBF),
FBF =.. [H | T],
H = every,
T = [V | T2],
T2 = [H2 | _ ],
H2 =.. [Op | T3],
T3 = [H3 | T4],
Op = exist,
skolem_function([V], SF),
exist_private(H3, SF, T4, [], NL),
H3 = SF,
NFBF =.. NL,
fbf2cnf(NFBF, NL2),
CNFFBF = NL2, !.
fbf2cnf(FBF, CNFFBF) :-
compound(FBF),
FBF =.. [H | T],
H = every,
T = [_ | T2],
T2 = [H2 | _ ],
H2 =.. [Op | _],
Op \= exist,
fbf2cnf(H2, CNF),
CNFFBF = CNF, !.
/*----------------------------------------- */
fbf2cnf_private([H | _], CNFFBF) :-
termine(H),
CNFFBF = H, !.
fbf2cnf_private([H | _], CNF) :-
H =.. [H1 | T],
H1 = exist,
T \= [],
T = [_ | T2],
FBF =.. T2,
exist(V, FBF),
CNF = V.
fbf2cnf_private(L, CNF) :-
L = [H | _],
H =.. [H1 | Ls],
H1 = and,
valid_fbf(H),
and(H1, Ls, CNF1),
CNF2 =.. CNF1,
flatten_and(CNF2, NL),
append([and], NL, Temp),
Final =.. Temp,
CNF = Final, !.
fbf2cnf_private(L, CNF) :-
L = [H | _],
H =.. [H1 | Ls],
H1 = or,
valid_fbf(H),
or(H1, Ls, CNF1),
CNF2 =.. CNF1,
flatten_or(CNF2, NL),
append([or], NL, Temp),
Final =.. Temp,
CNF = Final, !.
fbf2cnf_private([H | _], CNF) :-
H =.. [H1 | _],
H1 = not,
not_counter(H, M),
CNF = M.
fbf2cnf_private([H | _], CNF) :-
H =.. [H1 | T],
H1 = implies,
implies(T, M),
fbf2cnf(M, M1),
CNF = M1, !.
什么是
variabile/1
,termine/1
,predicato/1
?在任何情况下:太多的特殊情况,错位切割等。您是否尝试过进行跟踪
?这个错误对我来说非常具体。在代码的某行中,当Prolog需要一个原子项时,您正在呈现一个复合项。但是根据您提供的信息,很难判断它到底指的是代码的哪一部分。代码中的skf1
在哪里?有些东西不见了。。。