Prolog 列表,将 1 添加到列表的尾部
Prolog Lists, Add 1 to tail of the list
我正在尝试将 1 或 2 添加到 SWI-Prolog 列表中的数字。
我已经设法将 1 或 2 添加到列表的头部,但是我在添加到列表尾部的每个元素时遇到困难。我不想在不同的时间同时向每个元素添加 1 或 2。 IE。如果我的输入是
添加([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;
...
我正在尝试将 1 或 2 添加到 SWI-Prolog 列表中的数字。
我已经设法将 1 或 2 添加到列表的头部,但是我在添加到列表尾部的每个元素时遇到困难。我不想在不同的时间同时向每个元素添加 1 或 2。 IE。如果我的输入是 添加([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;
...