我有列表[r,s,2,t,3,u,v]
,我需要制作一个类似[r,5,s,2,t,3,u,5,v,5]
的列表。规则是:对于未跟随整数的每个非整数,将在该元素之后添加5
。
我是Prolog的新手,到目前为止这是我的代码:
insertInL([],[]).
insertInL([F,S|Tail], [F,X|Rest]) :-
integer(S), X = S, insertInL(Tail, Rest).
我知道应该有一个案例,其中S不是一个整数,但我不知道如何处理它。
编辑:
我更新了我的代码:
insertInL([],[]).
insertInL([F,S|T1], [F,S|T2]) :-
integer(S), insertInL(T1, T2).
insertInL([F,S|T1], [F,1|T2]) :-
\+ integer(S), insertInL([S|T1], T2).
现在它没有问题,除非我有一个非整数作为最后一个元素。
EDIT2:
现在它运作正常。
insertInL([],[]).
insertInL([F],[F,1]) :-
\+ integer(F).
insertInL([F,S|T1], [F,S|T2]) :-
integer(S), insertInL(T1, T2),!.
insertInL([F,S|T1], [F,1|T2]) :-
\+ integer(S), insertInL([S|T1], T2).
答案 0 :(得分:3)
以下是如何在保留logical-purity的同时做到这一点!
基于 if_/3
和 integer_t/2
我们定义:
list_fived([], []). list_fived([X|Xs], [X|Ys]) :- if_(integer_t(X), list_fived(Xs, Ys), past_nonint(Xs, Ys)). past_nonint([], [5]). past_nonint([X|Xs], Ys0) :- if_(integer_t(X), (Ys0 = [X|Ys], list_fived(Xs, Ys)), (Ys0 = [5|Ys], list_fived([X|Xs], Ys))).
使用SICStus Prolog 4.3.2的示例查询:
| ?- list_fived([r,s,2,t,3,u,v], Xs). Xs = [r,5,s,2,t,3,u,5,v,5] ? ; % expected result as given by the OP no