1

假设我有一个谓词 eval(A) 仅根据某些输入计算为真/假

现在的问题是,我想要另一个成功的谓词 and(List, R) 如果 List 为空/List 中每个元素的 eval 的合取为 R。其中R 只是 true/false

因此,如果 List 有项目 [a, b, c],则返回 [eval(a) ^ eval(b) ^ eval(c)] == R

我的尝试:

and([], true).
and([H|T], R) :- eval(H), and(T, R).
and([H|T], R) :- eval(H) = R.

但我不知道如何正确地与 R 进行比较。

4

1 回答 1

1

Prolog 有一个关系数据模型,谓词不携带值。您必须向 eval/1 添加一个参数,保存“返回值”。

and([], true).
and([H|T], R) :-
 eval(H, X),  % could 'shortcircuit' to false here if X is false
 and(T, And),
 ( X == true, And == true -> R = true ; R = false ).

在不更改 eval/1 的情况下,编辑可能会更好:

and(L, R) :- 
   maplist(eval, L) -> R = true ; R = false.
于 2013-04-07T05:39:59.433 回答