swi prolog统一返回列表中的元素

时间:2012-01-04 16:53:34

标签: prolog logic

我想返回列表中的所有元素,如下面X中的结果

?return_list_members([1,2,3,4,5], X).
X = 1 ;
X = 2 ;
X = 3 ;
X = 4 ;
X = 5.

我有以下代码,但也返回空列表元素[]女巫不可取

return_member(X, X).
return_list_members([], []).
return_list_members([H|T], X) :- return_member(H, X); return_list_members(T, X).
被询问时

输出

?return_list_members([1,2,3,4,5], X).
X = 1 ;
X = 2 ;
X = 3 ;
X = 4 ;
X = 5 ;
X = [].

最后结尾的真或假值也不可取。

目标是实现一个功能输出,如/ 3 之间的内置函数,以便在foreach 语句中使用

2 个答案:

答案 0 :(得分:1)

请注意,您尝试编写的过程是内置谓词成员/。

?- member(X, [1,2,3,4,5]).
X = 1 ;
X = 2 ;
X = 3 ;
X = 4 ;
X = 5.

您也可以编写自己的定义,例如:

return_list_members([X|_], X).
return_list_members([_|T], X):-
  return_list_members(T, X).

如果你不希望解释器在结尾处返回'false',你可以在开头添加另一个子句(作为第一个子句):

return_list_members([X], X):- !.

但请注意,如果您使用第一个未实例化的参数调用此过程,则此子句会产生副作用。

答案 1 :(得分:0)

我试着在_ / 3之间写作:

between_(X, X, X) :-
    !.
between_(X, Y, X) :-
    X < Y.
between_(X, Y, N) :-
    X < Y,
    T is X + 1,
    between_(T, Y, N).

第一个条款需要避免最终的错误(正如gusbro已经注意到的那样)。