【问题标题】:Prolog Lists, Add 1 to tail of the listProlog 列表,列表尾部加 1
【发布时间】:2015-03-23 01:24:49
【问题描述】:

我正在尝试将 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 添加到列表尾部的元素上吗?

【问题讨论】:

  • 只是好奇,你为什么在中缀操作中使用前缀符号?
  • 老实说,我是 prolog 的新手,这种方式有点道理。我确定我的编码方式不是最好的方式哈哈

标签: list math prolog


【解决方案1】:

首先定义一个谓词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 谓词为 addXX=1X=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].

【讨论】:

  • 感谢您的回答!如果我要更改加减法,我有时会得到我不想要的负数,除了不想在我的列表中出现 0。因此,我认为通过删除元素(如果它是 -1 或 0)是解决这个问题的最简单方法,但我又不是 100% 确定如何实现这个:/
【解决方案2】:

有时更详细可以更清楚:

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

【讨论】:

  • 感谢您的回答!如果我要更改加减法,我有时会得到我不想要的负数,除了不想在我的列表中出现 0。因此,我认为通过删除元素(如果它是 -1 或 0)是解决这个问题的最简单方法,但我又不是 100% 确定如何实现这个:/
  • 再次感谢您的编辑! :) 虽然这有帮助,但这并不是我想要达到的目标,但那是因为我没有正确解释。因此,如果我有一个查询:add([1,2,3], X). 并使用此代码减 1,我将得到 X = [0,2,3]X = [1,1,3]X = [1,2,2]。但是,尽管这是正确的,但我希望将 0 从列表中完全删除。即第一个结果是X = [2,3]。我找到了有关如何删除第 n 个元素的帮助,但没有找到有关删除特定字符或数字的帮助
猜你喜欢
  • 1970-01-01
  • 2015-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多