0

我将 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

4

0 回答 0