Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog 子句化序言错误_Prolog - Fatal编程技术网

Prolog 子句化序言错误

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

我在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(_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
在哪里?有些东西不见了。。。