当且仅当L是包含R中不是列表的所有项的列表时,我才需要编写成功的谓词f(L,R)。 例如:
f(L,[1,2,3,[4,5,6],[[7,8,9]],[]]).
应该给:
L = [1,2,3,4,5,6,7,8,9]
我编写了一个谓词,它给出了以下结果:
L = [1,2,3,4,5,6,7,8,9,[]]
结果中不应出现空列表。我的谓词如下:
f([],[]).
f(V,[H|T]):- H = [_|_] -> append(L,R,V),
f(L,H), f(R,T),!;
V = [H1|T1], H1=H, f(T1,T).
我有两个疑问。首先,结果中不应出现空列表。此外,我不知道为什么它不起作用,如果我不切割(!)。事实上,如果我不切割它会给我上面的结果,但如果我要求另一个结果它会永远循环。我真的不明白为什么这应该循环。
答案 0 :(得分:1)
要删除空列表,请处理该情况(丢弃它)。
关于循环:我认为原因可能是你正在调用append(L,R,V)并且没有实例化所有参数:在递归调用之后移动追加。
最后,也许你没有正确使用'if then else'结构:我使用通常的SWI-Prolog源格式缩进,使用缩进突出显示'顺序'调用
f([], []).
f(V, [H|T]) :-
( H = [] % if H = []
-> f(V, T) % then discard
; H = [_|_] % else if H is list
-> f(L,H), % flat head
f(R,T), % ...
append(L,R,V)
; V = [H|T1], % else
f(T1,T) % ...
).