如何编写一个将列表作为输入的谓词,并使用 Prolog 将该列表中的所有列表类型条目附加到新列表?
How do I write a predicate that takes as input a list, and appends all list-typed entries from this list to a new list using Prolog?
应该用左递归的方式来做。现在我们有这个:
listsFromList([],[]) .
listsFromList([Head|Tail], LL):-
listsFromList(Tail,LL),
is_list(Head),
append(Head,LL, Newlist), LL is Newlist.
listsFromList([Head|Tail], LL):-
listsFromList(Tail,LL),
not(is_list(Head)), LL is LL.
但是它一直给我这个错误:
ERROR: Type error: `[]' expected, found `[a,b]' (a list) ("x" must hold one character)
例如,如果我这样查询。输出应该是这样的:
?- listsFromList([1,[],2,3,4,[a,b]],X).
X = [[], [a, b]] .
有人可以向我解释我做错了什么吗?
你可以使用is_list:-
list([],[]).
list([H|T],[H|B]):-
is_list(H),
list(T,B).
list([H|T],B):-
\+is_list(H),
list(T,B).
?-list([1,[],2,3,4,[a,b]],X).
X = [[], [a, b]]
应该用左递归的方式来做。现在我们有这个:
listsFromList([],[]) .
listsFromList([Head|Tail], LL):-
listsFromList(Tail,LL),
is_list(Head),
append(Head,LL, Newlist), LL is Newlist.
listsFromList([Head|Tail], LL):-
listsFromList(Tail,LL),
not(is_list(Head)), LL is LL.
但是它一直给我这个错误:
ERROR: Type error: `[]' expected, found `[a,b]' (a list) ("x" must hold one character)
例如,如果我这样查询。输出应该是这样的:
?- listsFromList([1,[],2,3,4,[a,b]],X).
X = [[], [a, b]] .
有人可以向我解释我做错了什么吗?
你可以使用is_list:-
list([],[]).
list([H|T],[H|B]):-
is_list(H),
list(T,B).
list([H|T],B):-
\+is_list(H),
list(T,B).
?-list([1,[],2,3,4,[a,b]],X).
X = [[], [a, b]]