高阶谓词

1 prolog higher-order-functions meta-predicate

boolean(true).
boolean(false).
formula_0(P, Q):- (P; Q), \+ P.

solution_for_formula(P, Q, Formula):-
    maplist(boolean, [P, Q]), call([Formula, P, Q]).
Run Code Online (Sandbox Code Playgroud)

对我之前的问题的跟进。为什么这行不通?(如果我call([Formula, P, Q])formula_0(P, Q)它替换它有效。)

Pau*_*ura 5

你想要call(Formula, P, Q),没有call([Formula, P, Q])。只需删除方括号。试试这个以更清楚地说明错误是什么:

?- write_canonical(call([Formula, P, Q])).
call('.'(_,'.'(_,'.'(_,[]))))
true.
Run Code Online (Sandbox Code Playgroud)

即使用方括号,您正在调用一个(.)/2您(可能)没有定义的谓词。但是您要调用的高阶谓词是call/3,其参数是call(Closure, Arg1, Arg2)。例如call(formula_0, true, false)会调用formula_0(true, false)

  • 可能作为 `(=..)/2` 标准谓词的参数,允许您在术语与其列表表示之间进行转换。例如调用 `foo(A,1) =.. [foo, A, 1]` 是正确的。 (2认同)