У меня есть вопрос по теме этого вопроса (Создать словарь Prolog), но в нем используется немного разная лексика.
Я видел ответ, и хотя я знаю, что он правильный, я не хочу так описывать схему. Я хочу иметь возможность определять терминалы и сигналы.
Основное различие между используемыми словарями заключается в том, что мой использует
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).
Это выдает ошибку, так как вещи недостаточно созданы. Я знаю, где и в чем проблема, но не знаю, как ее решить.
Жду ответов/предложений. Я новичок в Прологе, поэтому буду рад любым советам (но да, я знаю, что должен соединять предложения одного и того же предиката).
circuit/1
? Одной из проблемных точек круговой логики может быть то, что у вас естьterminal(T) :- signal(T, V).
, но также иsignal(T1, V) :- terminal(T1), ...
. Они ссылаются друг на друга без какого-либо сведения к терминальному случаю. - person lurker   schedule 30.01.2014signal/2
(signal(T2,V) :-...
). Посколькуsame_signal
уже имеет дело с коммутативностью аргументов, это второе предложение является избыточным и позже может стать еще одной причиной зацикливания. - person lurker   schedule 01.02.2014