List Prolog在每个非整数元素后插入整数

List Prolog在每个非整数元素后插入整数,list,prolog,logical-purity,List,Prolog,Logical Purity,我有一个列表[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不是整数,但我不知道如何处理它 编辑: 我更新了代码

我有一个列表
[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).
现在它很好,除非我有一个非整数作为最后一个元素

编辑2:
现在它可以正常工作了

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).

以下是如何在保存的同时做到这一点

基于此,我们定义:

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))). 列出五个([],[])。 列表五([X|Xs],[X|Ys]):- 如果(整数)t(X), 列表五(Xs,Ys), 过去(x,y))。 过去分词([],[5])。 过去未发生([X | Xs],Ys0):- 如果(整数)t(X), (Ys0=[X | Ys],列表五(Xs,Ys)), (Ys0=[5 | Ys],列表五([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 |?列表五([r,s,2,t,3,u,v],Xs)。 Xs=[r,5,s,2,t,3,u,5,v,5]?;%OP给出的预期结果 不
如果你解决了你的问题,你能把它作为一个答案而不是编辑你的问题吗?