List 在prolog中表示表达式
正在尝试转换CNF表达式,例如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
(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)
。永远不要直接调用你认为是非终端的兼容形式。