在Prolog中实现Mock Concatenate

时间:2016-01-07 20:43:22

标签: prolog

注意:这是一个作业问题。我被困在这几个小时。简单地说它是一个''基本上导致代码行为异常。

预期产出

% ?- read_command(L).
% |: cal -n -r file1 file2
% L = concatenate([-n,-r],[file1,file2]).

观察到不正确的输出

% ?- read_command(L).
% |: cal -n -r file1 file2
% L = concatenate([], ['-n', '-r', file1, file2]).

我不确定如何成为' -r'和-n as' -n'。

read_command(L1):-             
   get0(C),
   read_command(_, L, C),name(X, L),atomic_list_concat([M1|T1],' ',X),
   ([M1] == [cat]
   ->cmd_cat([M1|T1],L1);
   L = L1).

minus_stripped(-X, X).

cmd_cat([_|T],Z):-
writeln(T),
divide_dashed(T,X,Y),writeln(X),writeln(Y),maplist(minus_stripped, X, Xs),
Z = concatenate(Xs,Y).

divide_dashed([],[] , []).
divide_dashed([-E|R], [-E|Ds], Ps) :- !, divide_dashed(R, Ds, Ps).
divide_dashed([E|R], Ds, [E|Ps]) :- divide_dashed(R, Ds, Ps).

再次感谢你的帮助。

1 个答案:

答案 0 :(得分:1)

divide_dashed(L, D, P) :-
    partition(dashed, L, D, P).
dashed(S) :- atom_concat(-,_,S).

或者,如果您正在运行最新版本的SWI-prolog,那么库(yall)可用:

divide_dashed(L, D, P) :-
    partition([S]>>atom_concat(-,_,S), L, D, P).