问题如下:考虑三个输入A,B,C,找到一个带有AND,OR和NOT门的布尔电路,使得输出不是(A),不是(B),而不是(C)使用at最多2个不是门。
我想找一个带prolog的电路。我的想法是计算一个带有函数的谓词“可访问”,并说它是否存在计算f的电路。
我有以下谓词:
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].
我想在11,12之间计算函数xor,所以我尝试了以下目标: 可访问的([0,1,1,0,0,1,1,0],X,4)。
但prolog运行了一段时间才得到了好的答案。我想知道如何改进程序以使其更快。
P.S。 如何使用GNU prolog打印没有ASCII代码的字符串?
答案 0 :(得分:1)
你搜索任意形成的布尔表达式,和 你基本上是在询问比特数组上的布尔代数 由以下位数组生成:
01010101
00110011
回忆一下布尔代数的常规形式。例如 联合正常形式。一个连接的正常形式读取 如下:
/\ clause_i
其中每个条款的格式为:
\/ literal_i
每个文字都有以下形式之一:
variable
~ variable
只需为生成器位数组获取2个变量。这个 以某种方式减少搜索空间。有2个变量 4个不同的条款。这使得2 ^ 4种不同的正常形式。
此外,如果您的目标是找到正常的表格 导致某个位数组,例如您指定的:
01100110
您可以通过考虑这一点来进一步修剪您的搜索 价值作为下限。
再见