問題は次のとおりです。3つの入力A、B、Cを考慮して、出力が最大2つのNOTを使用してnot(A)、not(B)、not(C)になるようなAND、OR、およびNOTゲートを備えたブール回路を見つけますゲート。
プロローグで回路を探したいと思います。私の考えは、関数を取り、f を計算する回路が存在するかどうかを示す述語 "accessible" を計算することです。
次の述語があります。
not([],[]).
not([H|T],[G|S]) :- G #=# 1-H, not(T,S).
or([],[],[]).
or([0|T],[0|S],[0|R]) :- or(T,S,R).
or([1|T],[0|S],[1|R]) :- or(T,S,R).
or([1|T],[1|S],[1|R]) :- or(T,S,R).
or([0|T],[1|S],[1|R]) :- or(T,S,R).
and([],[],[]).
and([1|T],[1|S],[1|R]) :- and(T,S,R).
and([0|T],[1|S],[0|R]) :- and(T,S,R).
and([1|T],[0|S],[0|R]) :- and(T,S,R).
and([0|T],[0|S],[0|R]) :- and(T,S,R).
accessible(_,_,0) :- !,fail.
accessible([0,1,0,1,0,1,0,1],[12],_) :- !.
accessible([0,0,1,1,0,0,1,1],[11],_) :- !.
accessible([0,0,0,0,1,1,1,1],[10],_) :- !.
accessible(F,L,C) :- CC is C-1, or(G,H,F), accessible(G,M,CC), accessible(H,N,CC), L=[0, [M,N]].
accessible(F,L,C) :- CC is C-1, and(G,H,F), accessible(G,M,CC), accessible(H,N,CC), L=[1,[M,N]].
accessible(F,L,C) :- CC is C-1, not(F,X), accessible(X,M,CC), L=[2,M].
関数 xor を 11,12 の間で計算したいので、accessible([0,1,1,0,0,1,1,0], X, 4) という目標を試します。
しかし、プロローグは、適切な答えを得るまでにしばらく実行されます。プログラムを高速化するために、プログラムを改善する方法を知りたいです。
PS GNU prolog を使用して ASCII コードなしで文字列を出力するにはどうすればよいですか?