【问题标题】:Check if all tuples in a list are different (ECLiPSe)检查列表中的所有元组是否不同(ECLiPSe)
【发布时间】:2016-05-17 13:18:20
【问题描述】:

我有一个这样的元组列表:

[(1,2),(5,3),(6,7)]

我正在尝试编写一个谓词来检查列表中的所有元组是否不同。以下行适用于包含整数的列表,但不适用于包含元组的列表:

all_diff(L) :- \+ (select(X,L,R),member(X,R)).

member/2 可以很好地检查一个元组是否在列表中,但它是 select/3 有元组问题。它给出了一个类型错误。

如何检查所有元组是否不同?

【问题讨论】:

  • select/3 给出类型错误?什么时候?
  • @false 例如,当我尝试以下查询时 select((1, 2), [(1, 3), (1, 2)], R). .
  • 您使用的是什么 Prolog 解释器? GNU? SWI?其他?你能解释为什么它不起作用吗?据我所知,代码按照您编写的方式运行。
  • SICStus、SWI 和 GNU 都不会对该查询产生错误!
  • @false 我正在使用 ECLiPSe 6.1,就是这样。仍然不明白为什么它在 ECLiPSe 中不起作用。

标签: list prolog tuples


【解决方案1】:

@false 指出 select/3 在 ECLiPSe 中不起作用,因为在那个系统中它是与文件相关的操作。

我想继续使用相同的系统,所以我为元组编写了一个选择:

%Given a list of tuples this checks if they are all different
allDiffTuples(L) :- \+ (selectTuple(X,L,R),member(X,R)).

selectTuple((A,B),[(A,B)|T],T).
selectTuple((A,B),[H|T],[H|R]) :-
    selectTuple((A,B),T,R).

【讨论】:

  • 为什么要这么具体?为什么不编写自己的更通用的select_element/3 来处理任何列表?那么它会更有用。 :) 只需将代码中的所有(A,B) 替换为X
猜你喜欢
  • 2011-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-01
  • 1970-01-01
  • 2014-08-11
  • 1970-01-01
相关资源
最近更新 更多