【问题标题】:Find a boolean circuit with prolog用 prolog 查找布尔电路
【发布时间】:2015-09-11 21:07:32
【问题描述】:

问题如下:考虑三个输入 A、B、C,找到一个带有 AND、OR 和 NOT 门的布尔电路,使得输出为 not(A)、not(B)、not(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 在得到好的答案之前运行了一段时间。我想知道如何改进程序以使其更快。

附: 如何使用 GNU prolog 打印没有 ASCII 码的字符串?

【问题讨论】:

  • 您正在混合约束 (#=#)/2、简单的算术 (is)/2 和丑陋的切割 !/0。
  • 这有什么问题?我应该怎么办 ?我怎样才能避免割伤?
  • not/2的第二个子句和accessible/3的最后一个子句有错别字。你在正文中写了 non/2,但我想它应该是 not/2。

标签: prolog backtracking gnu-prolog


【解决方案1】:

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

   01010101  
   00110011  

回想一下布尔代数的正规形式。例如 合取范式。合取范式为 如下:

    /\ clause_i

其中每个子句的格式为:

    \/ literal_i

每个字面量都有以下任一形式:

    variable
    ~ variable

只需为您的生成器位数组取 2 个变量。这个 以某种方式减少搜索空间。有2个变量 4个不同的条款。这产生了 2^4 种不同的范式。

此外,如果您的目标是找到一个范式, 产生某个位数组,如你指定的:

 01100110

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

再见

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-18
    • 2021-11-23
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多