我在将列表列表合并到单个列表时遇到问题

时间:2019-04-04 10:39:36

标签: prolog

我正在编写一种解决方案,以使用递归计算列表中数字之间的距离,但一直在努力获得预期的输出。 我正在尝试将列表列表合并为一个列表,但是尝试使用flatten和append / 2无效。我已经尝试了几个小时,并且一直绕着圈子转圈,有人可以告诉我我在做什么错吗?

:- use_module(library(clpfd)).

difference([],_,[]).
differwnce([L|Ls],X,[DST|Ds]) :-
   DST #= abs(X - L),
   difference(Ls,X,Ds).

differences[],[]).
differences([L|Ls], [DST|Tail]) :-
   difference(Ls,X,DST),
   differences(Ls, Tail).

以下是预期的输入和输出:-

?- differences([1,2,4,9],Ds).
Ds = [1,3,8,2,7,5].

当前输出:

Ds = [[1,3,8],[2,7],[5],[]].

3 个答案:

答案 0 :(得分:2)

seq([]) --> [].
seq([E|Es]) --> [E], seq(Es).

seqq([]) --> [].
seqq([Es|Ess]) -->
  seq(Es),
  seqq(Ess).

?- phrase(seqq([[1,3,8],[2,7],[5],[]]), Es).
Es = [1,3,8,2,7,5].

答案 1 :(得分:1)

您可以将override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { let sectionHeaderView = UIView() let sectionHeaderImage = UIImage(named: "Flag - ENGLAND.png")! let sectionHeaderImageView = UIImageView(image: sectionHeaderImage) sectionHeaderImageView.translatesAutoresizingMaskIntoConstraints = false sectionHeaderView.addSubview(sectionHeaderImageView) NSLayoutConstraint.activate([ sectionHeaderImageView.widthAnchor.constraint(equalToConstant: 40), sectionHeaderImageView.heightAnchor.constraint(equalToConstant: 40), sectionHeaderImageView.leadingAnchor.constraint(equalTo: sectionHeaderView.leadingAnchor, constant: 50), sectionHeaderImageView.topAnchor.constraint(equalTo: sectionHeaderView.topAnchor, constant: 50) ]) return sectionHeaderView } 谓词转换为distances/3谓词,从而有效地使用打开列表 来返回后面元素的列表尾部。

distances/4

通话示例:

:- use_module(library(clpfd)).

distances([], _, Tail, Tail).
distances([BN| Bs], B, [DST| Ds], Tail) :-
   DST #= abs(B - BN),
   distances(Bs, B, Ds, Tail).

triangle([], []).
triangle([BN| Bs], Ds) :-
    distances(Bs, BN, Ds, Tail),
    triangle(Bs, Tail).

要更好地理解此解决方案,请考虑以下查询的结果:

?- triangle([1,2,4,9], Ds).
Ds = [1, 3, 8, 2, 7, 5].

此解决方案比最后调用诸如?- distances([2,4,9], 1, Ds, Tail). Ds = [1, 3, 8| Tail]. append/2之类的谓词更为有效。

P.S。如果您仍然需要flatten/3谓词以在其他地方使用,则可以轻松定义它:

distances/3

答案 2 :(得分:1)

为什么不像这样使用库谓词append/2

?- append([[1,3,8],[2,7],[5],[]], Xs).
Xs = [1,3,8,2,7,5].
相关问题