我将 Logic De Morgan 规则应用于集合的所有节点。每当我断言/撤回与指定格式匹配的节点时,查询似乎就停在那里并返回 no。虽然这不会导致应用德摩根规则一次出现问题,但当我尝试多次应用它时会导致问题,因为它会立即使查询失败。我已经做了相当多的测试,所以我相当确定问题出在哪里,但随时推荐我可能错过的东西。--------- De Morgan Rule: -(AVB) -> - A & -B____ 显示为 not(or(A,B) -> and(not(A),not(B))。new_node_name 只是为调整后的节点生成新标签。
%These are the preset nodes
:- dynamic(node/4).
node(n1, 'and', n3, n2).
node(n2, 'not', n6, void).
node(n3, 'not', n4, void).
node(n4, 'or', n5, n9).
node(n5, 't', void, void).
node(n9, 'u', void, void).
%node(n3, 'or', n4, n5).
%node(n4, 'r', void, void).
%node(n5, 'or', n9, n10).
node(n6, 'or', n7, n8).
node(n7, 'p', void, void).
node(n8, 's', void, void).
printTree(X) :-
node(X, Value, Left, Right),
format('~w', [Value]),
( Value = 'and' -> write('(') ; true),
( Value = 'or' -> write('(') ; true),
( Value = 'not' -> write('(') ; true),
printTree(Left),
( Value = 'and' -> write(',') ; true),
( Value = 'or' -> write(',') ; true),
printTree(Right),
( Value = 'and' -> write(')') ; true),
( Value = 'not' -> write(')') ; true),
( Value = 'or' -> write(')') ; true).
printTree(void).
deMorgan(X) :-
node(X, 'not', Y, void),
node(Y, Value, Left, Right),
node(Left, Value1, void, void),
node(Right, Value2, void, void),
new_node_name(B, 2),
new_node_name(C, 3), %simply generating tags for the asserted nodes
new_node_name(D, 4),
new_node_name(E, 5),
asserta(node(X, 'and', B, C)),
asserta(node(B, 'not', D, void)),
asserta(node(C, 'not', E, void)),
asserta(node(D, Value1, void, void)),
asserta(node(E, Value2, void, void)),
retract(node(X, 'not', Y, void)),
retract(node(Y, Value, Left, Right)),
retract(node(Left, Value1, void, void)),
retract(node(Right, Value2, void, void)).
% seems to return 'no' after I retract, no matter where I place it.
new_node_name(X, Y):-
count_nodes(n1, N),
Ne is N + Y,
number_atom(Ne,NewAtom),
atom_concat(n, NewAtom, X).
count_nodes(X,N):-
node(X, Value, L, R),
count_nodes(L,NL),
count_nodes(R,NR),
N is NL + NR + 1.
count_nodes(void,0).
to run: 1. printTree(n1).
2. deMorgan(n2). or deMorgan(n3).
3. printTree(n1).
output: no
expected output: yes
相应的分支应该调整,但查询仍将返回 no