0

リスト要素がアトムの場合、各アトムの後にテストをリストに挿入し、具体的なリストを構築するプロローグプログラムを構築しようとしています。

言う

たとえば。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)
                               ).

余分な括弧を取り除く方法や、リストを 1 つのレベルにフラット化する方法を誰かが知っている場合。解決策/レビューを投稿してください。

4

2 に答える 2

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
| ?-
于 2013-10-29T13:09:03.237 に答える