List 序言列表,在列表末尾添加1

List 序言列表,在列表末尾添加1,list,math,prolog,List,Math,Prolog,我试图在SWI Prolog的列表中为数字添加1或2 我已经设法在列表的开头添加了1或2个元素,但是在添加到列表末尾的每个元素时遇到了困难。我不想在不同的时间同时为每个元素添加1或2。即,如果我的输入是 加上([2,3,4],X) 我希望X的可能性如下: X=[3,3,4] X=[4,3,4] X=[2,4,4] X=[2,5,4] X=[2,3,5] X=[2,3,6] 我目前的代码是: add([],[]). add([H1|T1],[H2|T2]) :-

我试图在SWI Prolog的列表中为数字添加1或2

我已经设法在列表的开头添加了1或2个元素,但是在添加到列表末尾的每个元素时遇到了困难。我不想在不同的时间同时为每个元素添加1或2。即,如果我的输入是 加上([2,3,4],X)

我希望X的可能性如下:
X=[3,3,4]
X=[4,3,4]
X=[2,4,4]
X=[2,5,4]
X=[2,3,5]
X=[2,3,6]

我目前的代码是:

add([],[]).
add([H1|T1],[H2|T2]) :-
                    is(H2,+(H1,1)), T1=T2;
                    is(H2,+(H1,2)), T1=T2.

显然,这只会在列表的开头添加1或2,而不是尾部。因此,有人知道我如何在列表尾部的元素中添加1或2吗?

首先定义一个谓词
addX/3
,该谓词将向第一个列表的一个成员添加X:

addX([], [],_).     % base case
addX([H|T], [H1 | T], X) :- H1 is H + X.   % add to first element
addX([H|T], [H | T1], X) :- addX(T, T1, X). % or retain the first element and add to some element in the tail
然后使用它将
add
谓词定义为
addX
,使用
X=1
X=2

add(L, R) :- addX(L, R, 1).
add(L, R) :- addX(L, R, 2).
测试:

?- add([2,3,4], X).
X = [3, 3, 4] ;
X = [2, 4, 4] ;
X = [2, 3, 5] ;
X = [2, 3, 4] ;
X = [4, 3, 4] ;
X = [2, 5, 4] ;
X = [2, 3, 6] ;
X = [2, 3, 4].

有时更详细的内容可能更清楚:

add([],[]).
add([H1|T],[H2|T]) :-
 H2 is H1+1.
add([H1|T],[H2|T]) :-
 H2 is H1+2.
add([H|T1],[H|T2]) :-
 add(T1,T2).
现在列出了备选方案,最后一个只是递归地处理剩余的元素

无论如何,您的代码只是缺少一行:

add([],[]).
add([H1|T1],[H2|T2]) :-
 is(H2,+(H1,1)), T1=T2;
 is(H2,+(H1,2)), T1=T2;
 H1=H2, add(T1,T2).
注释后,以下是如何减去并仅保留正值:

add([H1|T1],[H2|T2]) :-
 H2 is H1-1, H2 > 0, T1=T2;
 ...

好奇的是,为什么要用前缀符号来表示中缀运算呢?老实说,我对prolog还不熟悉,这样做有点道理。我相信我的编码方式不是最好的方式,谢谢你的回答!如果我改变加减法,我有时会得到我不想要的负数,除了不想要列表中的0之外。因此,我认为,如果元素为-1或0,则删除该元素是解决此问题的最简单方法,但我仍然无法100%确定如何实现此功能:/谢谢您的回答!如果我改变加减法,我有时会得到我不想要的负数,除了不想要列表中的0之外。因此,我认为如果元素为-1或0,则删除该元素是解决此问题的最简单方法,但我仍然无法100%确定如何实现此功能:/Thank your edit again!:)虽然这很有帮助,但这并不完全是我想要实现的,但那是因为我没有正确地解释。因此,如果我有一个查询:
add([1,2,3],X)。
如果用这个代码减去1,我会得到
X=[0,2,3]
X=[1,1,3]
,和
X=[1,2,2]
。不过,尽管这是正确的,但我希望从列表中完全删除0。i、 e.对于第一个结果,它将是
X=[2,3]
。我找到了关于如何删除第n个元素的帮助,但没有找到任何关于删除特定字符或数字的帮助