我有一个关于这个主题的问题(Create Prolog Vocabulary),但使用的词汇略有不同。
我已经看到了答案,即使我知道它是正确的,我也不想那样描述电路。我希望能够确定终端和信号。
使用的词汇之间的主要区别是我使用
signal(in(inPortNumber, portName), signalValue)
考虑到这一点,我有几个问题:
已解决 1 - 我如何写“如果 C 是一个电路,让它的数量为 I, J (I = numInPorts, J = numOutPorts)。对于 N (0 < N < I) 的所有可能值,输入端口号 N C 是一个终端”?
这就是我所拥有的,但它不起作用(无限循环):
% Check arity of IN wires
% If more in wires than gate can support, it's an error
terminal(in(N, C)) :- circuit(C), arity(C, I, _J), N < I, N > 0.
编辑 2 - 如何编写“如果端子 T1 和 T2 已连接,并且已为 T2 分配了一个信号,则还为 T1 分配了该信号值”?
这就是我所拥有的:
% FACTS
circuit('c1').
arity('c1', 3, 2).
gate('x1').
type('x1', xorGate).
are_connected(in(1, 'c1'), in(1, 'x1')).
are_connected(in(2, 'c1'), in(2, 'x1')).
signal(in(1, 'c1'), 1).
signal(in(2, 'c1'), 1).
signal(in(3, 'c1'), 1).
% RULES
% All gates are circuits
circuit(G) :- gate(G).
% Check arity of IN wires
terminal(in(N, G)) :- circuit(G), arity(G, I, _J), N =< I, N > 0.
% Check arity of OUT wires
terminal(out(N, G)) :- circuit(G), arity(G, _I, J), N =< J, N > 0.
% Signals do only exist in terminals
terminal(T) :- signal(T, _V).
% Arity
arity(G, 1, 1) :- gate(G), type(G, notGate). % NOT gate
arity(G, 2, 1) :- gate(G), type(G, V), not(V = notGate). % Other gates
% Commutativity
connected(T1, T2) :- are_connected(T1, T2), !.
connected(T2, T1) :- are_connected(T1, T2), !.
% Connectivity
same_signal(T1, T2) :- terminal(T1), terminal(T2), not(T1 = T2), connected(T1, T2).
signal(T1, V) :- same_signal(T1, T2), signal(T2, V), !.
signal(T2, V) :- same_signal(T1, T2), signal(T1, V), !.
问题是,当询问时:
signal(in(1, x1), V).
它会引发错误,因为事情没有充分实例化。我知道问题出在哪里以及问题出在哪里,但我不知道如何解决。
期待答案/建议。我是 Prolog 的新手,所以欢迎所有提示(但是是的,我知道我应该将同一个谓词的子句放在一起)。