我在Prolog(SWI-Prolog)中有一个非常简单(我想)的问题,但我无法弄明白。
我想要的是创建一个递归谓词,它能够将任何嵌套列表交换为复合词。
我想在这两个表示之间进行交换,因为我正在使用替代算法,该算法适用于列表表示,我希望将复合表示作为输出。
所以我想:
list_2_compound(List,Compound).
例如
list_2_compound([seq, [seq, [if, p1, p2], p2], p1, p3], Compound).
Compound = seq(seq(if(p1, p2), p2), p1, p3)
所以我通常想使用= ..运算符:
Compound =.. [if, p1, p2]
Compound = if(p1,p2)
但现在以递归的方式横向嵌套列表。
答案 0 :(得分:3)
list_2_compound(L, T) :-
var(T)
-> L = [F|Fs], maplist(list_2_compound, Fs, Ts), T =.. [F|Ts]
; atomic(T)
-> L = T
; L = [F|Fs], T =.. [F|Ts], maplist(list_2_compound, Fs, Ts).
list_2_compound(T, T).
(我之前的帖子在相反的情况下产生了太多的嵌套列表)。测试:
1 ?- list_2_compound([seq, [seq, [if, p1, p2], p2], p1, p3], Compound).
Compound = seq(seq(if(p1, p2), p2), p1, p3)
.
2 ?- list_2_compound(S, $Compound).
S = [seq, [seq, [if, p1, p2], p2], p1, p3]
.