0

如何在内部术语上使用 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]

4

1 回答 1

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中的yall ,其他人可能可以编写此代码:

?- 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所以我认为它不会发生冲突)。

于 2022-01-19T19:59:49.970 回答