在Prolog程序中展平列表

时间:2013-10-29 08:02:10

标签: prolog

我正在尝试构建prolog程序,其中如果list元素是atom,则在每个原子插入测试后进入列表并构造具体列表。

例如。 addtest([1,2,3,a,2,v],L). 应该是:L= [1,2,3,a,test,2,v,test]

我得到:L=[1,2,3,[a,test],2,[v,test]]

通过实现以下逻辑。如何将嵌套的括号移除/展平到列表中,以便我得到预期的答案。

方案。

add([ ], L, L).
add([H|T], L, [H|M]) :- add(T, L, M).

addtest([], []).
addtest([H | T], [RH | RT]) :- (number(H)-> RH=H, addtest(T,RT)
                               ;atom(H)-> add([H],[test],RH),addtest(T,RT)
                               ).

如果有人知道如何摆脱额外的括号或如何将列表展平到一个级别。 请发布解决方案/评论。

2 个答案:

答案 0 :(得分:1)

addtest([], []).
addtest([H | T], [H | RT]) :- (number(H)-> addtest(T,RT)
                               ;atom(H)-> add([test],R,RT),addtest(T,R)
                               ).

add([test],R,RT)部分实例化RT以便RT = [test | R]。所以我们继续添加R新尾部(在第二个子句中)。

对于常规解决方案,请浏览https://stackoverflow.com/search?q=%5Bprolog%5D+flatten

答案 1 :(得分:0)

作为主题变体的提供:

% addtest/2 adds 'test' after each 'atom' in the list
addtest(Lin, Lout) :-
    additem(Lin, atom, test, Lout).  % Add 'test' after every 'atom' in `Lin`

% additem/4 adds 'X' after every list item that succeeds for 'Check'

% add 'X' after 'H' if 'H' passes 'Check'
additem([H|Tin], Check, X, [H,X|Tout]) :-
    CheckIt =.. [Check, H],    % Create `atom(H)` in this case
    CheckIt,                   % Check `atom(H)` succeeds
    additem(Tin, Check, X, Tout).

% don't add 'X' after 'H' if 'H' fails 'Check'
additem([H|Tin], Check, X, [H|Tout]) :-
    CheckIt =.. [Check, H],    % Create `atom(H)` in this case
    \+ CheckIt,                % Check `atom(H)` fails
    additem(Tin, Check, X, Tout).

% Add item to empty list gives the empty list
additem([], _, _, []).

| ?- addtest([1,2,3,a,2,v],L).

L = [1,2,3,a,test,2,v,test] ? ;

(2 ms) no
| ?-