2013-04-07 100 views
1

說我有一個謂語的eval(A),只是計算結果爲真/假取決於一些輸入序言(SWI):與列表結合?

現在的問題是,我想另一個謂詞 和(列表,R) 是成功當且僅當列表是empty /列表中每個元素的eval的連接點是R.其中R僅爲真/假

所以,如果有列出的項目[A,B,C],然後返回[EVAL(一)^的eval(B)^的eval(C)] == [R

我嘗試:

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

但我不知道如何正確比較R.

回答

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.