1

いくつかの入力に応じて真/偽に評価される述語 eval(A) があるとします

ここで、 List が空である場合に成功する別の述語 and(List, R)が必要です/List 内のすべての要素の eval の結合が R です。ここで、 R は true/falseです。

リストに項目 [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 に答える