Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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
List 在prolog中表示表达式_List_Prolog - Fatal编程技术网

List 在prolog中表示表达式

List 在prolog中表示表达式,list,prolog,List,Prolog,正在尝试转换CNF表达式,例如 (a'+b+c')(a+b+c) 在prolog中创建一个类似于 [[-a,+b,-c],[+a,+b,+c]]. 每个文字都表示为正或负。i、 e.如果a'这相当于一个原子,它是-a我想你可以试试这样的东西: cnf(A, F) :- atom_chars(A, C), conjunction(F, C, []), !. conjunction([D|C]) --> disjunction(D), conjunction(C). c

正在尝试转换CNF表达式,例如

(a'+b+c')(a+b+c)
在prolog中创建一个类似于

[[-a,+b,-c],[+a,+b,+c]]. 

每个文字都表示为正或负。i、 e.如果
a'
这相当于一个原子,它是
-a

我想你可以试试这样的东西:

cnf(A, F) :-
    atom_chars(A, C),
    conjunction(F, C, []), !.

conjunction([D|C]) --> disjunction(D), conjunction(C).
conjunction([C])   --> disjunction(C).
disjunction(D)     --> ['('], disjuncts(D), [')'].
disjunction(L)     --> literal(L).
disjuncts([L|D])   --> literal(L), disjuncts(D).
disjuncts([L])     --> literal(L).
literal(-P)        --> [+], proposition(P), ['\''].
literal(+P)        --> [+], proposition(P).
literal(-P)        --> proposition(P), ['\''].
literal(+P)        --> proposition(P).
proposition(P)     --> [P], { char_type(P,lower) }.
一些例子:

?- cnf('a', F).
F = [+a].

?- cnf('a\'', F).
F = [-a].

?- cnf('(a\')(+b)', F).
F = [[-a], [+b]].

?- cnf('(a\'+b+c\')', F).
F = [[-a, +b, -c]].

?- cnf('a\'+b+c\'', F).
F = [-a, +b, -c].

?- cnf('(a\'+b+c\')(a+b+c)', F).
F = [[-a, +b, -c], [+a, +b, +c]].

我想你可以试试这样的东西:

cnf(A, F) :-
    atom_chars(A, C),
    conjunction(F, C, []), !.

conjunction([D|C]) --> disjunction(D), conjunction(C).
conjunction([C])   --> disjunction(C).
disjunction(D)     --> ['('], disjuncts(D), [')'].
disjunction(L)     --> literal(L).
disjuncts([L|D])   --> literal(L), disjuncts(D).
disjuncts([L])     --> literal(L).
literal(-P)        --> [+], proposition(P), ['\''].
literal(+P)        --> [+], proposition(P).
literal(-P)        --> proposition(P), ['\''].
literal(+P)        --> proposition(P).
proposition(P)     --> [P], { char_type(P,lower) }.
一些例子:

?- cnf('a', F).
F = [+a].

?- cnf('a\'', F).
F = [-a].

?- cnf('(a\')(+b)', F).
F = [[-a], [+b]].

?- cnf('(a\'+b+c\')', F).
F = [[-a, +b, -c]].

?- cnf('a\'+b+c\'', F).
F = [-a, +b, -c].

?- cnf('(a\'+b+c\')(a+b+c)', F).
F = [[-a, +b, -c], [+a, +b, +c]].

我也很好奇如何处理prolog中的a?我也很好奇如何处理prolog中的a?
连词(F,C,[])
-->
短语(连词(F,C)
。永远不要直接调用你认为是非终结符的符合形式。
连词(F,C,[])
-->
短语(连词(F,C)
。永远不要直接调用你认为是非终端的兼容形式。