【问题标题】:Prolog maplist on inner term?内部术语的Prolog maplist?
【发布时间】:2022-01-20 03:59:49
【问题描述】:

如何在内部术语上使用maplist?

假设 KB 为:

gate(not(o), i). 
gate(not(i), o).

gate(and(o, i), o).
gate(and(i, o), o).
gate(and(B, B), B).

bits([i,o,o,i,i]).

以下操作无效: ?- bits(BITS), maplist(gate(not(X), Y), BITS, ANS)

如何映射列表以便:

[i,o,o,i,i] -> [not(i), not(o), not(o), not(i), not(i)] ->[o,i,i,o,o]

这可以在任何列表长度上完成:

:- bits([A,B,C,D,E]), gate(not(A), Anew), gate(not(B), Bnew), gate(not(C), Cnew), gate(not(D), Dnew), gate(not(E), Enew), ANS = [Anew, Bnew, Cnew, Dnew, Enew].

所以答案是:ANS = [o, i, i, o, o]

【问题讨论】:

    标签: list prolog functor maplist


    【解决方案1】:

    使用辅助谓词:

    not(A, Z) :-
        gate(not(A), Z).
    
    ?- bits(BITS), maplist(not, BITS, ANS).
    
    ANS  = [o, i, i, o, o],
    BITS = [i, o, o, i, i]
    

    但是如果你要添加两行helper,跳过gate()的东西,直接写:

    not(o, i).
    not(i, o).
    
    ?- bits(BITS), maplist(not, BITS, ANS).
    
    ANS  = [o, i, i, o, o],
    BITS = [i, o, o, i, i]
    

    如果您不想这样做,或者根本无法更改数据库,我知道的唯一方法是使用 lambda 库,例如 SWI Prolog 中的yallothers may be available 来编写:

    ?- bits(BITS), maplist([In, Out]>>gate(not(In), Out), BITS, ANS).
    
    ANS  = [o, i, i, o, o],
    BITS = [i, o, o, i, i]
    

    (将其命名为not 可能是一种不好的形式,但这是not/2 而内置是not/1,所以我认为它不会冲突)。

    【讨论】:

    • 我可以改变它,但如果我把它写成not(A, B),那么就不能写出类似的东西:gate(and(A, or(not(A), B)), and(A, B)) 意思是a.(!a+b) = a.b ...还是我会?我是 prolog 的新手,我正在尝试编写一个逻辑电路简化器(就像 wolfalpha 那样,首先重写公式)然后通过映射值来评估它...... Lambdas 应该是 prolog 标准的一部分,我'很惊讶它不是,我正在下载图书馆,谢谢你的链接
    • @Mustafa 我不知道;到目前为止,我无法理解你在做什么。我认为 maplist 不够复杂,无法帮助您处理像 gate(and(A, or(... 结构这样的任意嵌套树,您可能需要递归谓词来处理它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    • 2021-10-30
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    相关资源
    最近更新 更多