我想返回列表中的所有元素,如下面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 语句中使用
答案 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已经注意到的那样)。