找一个带prolog的布尔电路

时间:2014-05-29 16:23:43

标签: prolog backtracking gnu-prolog

问题如下:考虑三个输入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代码的字符串?

1 个答案:

答案 0 :(得分:1)

你搜索任意形成的布尔表达式,和 你基本上是在询问比特数组上的布尔代数 由以下位数组生成:

   01010101  
   00110011  

回忆一下布尔代数的常规形式。例如 联合正常形式。一个连接的正常形式读取 如下:

    /\ clause_i

其中每个条款的格式为:

    \/ literal_i

每个文字都有以下形式之一:

    variable
    ~ variable

只需为生成器位数组获取2个变量。这个 以某种方式减少搜索空间。有2个变量 4个不同的条款。这使得2 ^ 4种不同的正常形式。

此外,如果您的目标是找到正常的表格 导致某个位数组,例如您指定的:

 01100110

您可以通过考虑这一点来进一步修剪您的搜索 价值作为下限。

再见