我正在尝试构建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)
).
如果有人知道如何摆脱额外的括号或如何将列表展平到一个级别。 请发布解决方案/评论。
答案 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
| ?-