Prolog:以递归方式使用= .. / 2(Univ)

时间:2013-11-11 22:38:18

标签: recursion prolog nested-lists term

我在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)

但现在以递归的方式横向嵌套列表。

1 个答案:

答案 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] 
.