【问题标题】:Write a predicate which determines if a list is in ascending order编写一个判断列表是否按升序排列的谓词
【发布时间】:2018-04-25 20:19:23
【问题描述】:

我得到了以下谓词:

q8([]):-
q8([X]):-
q8([H|T]):-

需要提供如下输出

q8([2, 5, 8, 8, 8, 9]).
true.
q8([8, 5, 2, 8, 9]).
false.

我的尝试是:

q8([]):-true.
q8([X]):-true.
q8([H|T]):- H<T, q8(T).

但是这失败了,因为它试图将我的列表中的 tail 统一为仅允许一个元素的 q8([X])。我不太确定如何解决这个问题。

为了更清楚,如果你运行q8([2,5,8,8,8,9])。我收到一个错误,因为[5,8,8,8,9] 无法与X 统一。它永远不会到达第三个定义的q8 predicate

我正在为我的期末做练习题,所以你们不帮忙做作业!哈哈

【问题讨论】:

  • 不,问题是H &lt; T
  • 为了澄清@TomasBy 的评论,您将列表的头部与列表的其余部分进行比较。您可能想一次撕下两个项目并比较它们,然后在列表的尾部重复出现。
  • 简单的ordered([_]):- !.ordered([A,B|T]):- A &lt; B, ordered([B|T]).
  • 我同意,我做错了,但你不能修改左侧。您不能将有序 ([A|T]) 更改为有序 ([A,B|T])。还有其他方法吗?

标签: list prolog unification


【解决方案1】:
q8([]):-true.
q8([_X]):-true.
q8([H1,H2|T]):- H1=<H2, q8([H2|T]).

对于第三个子句,您需要查看列表中的前两个元素,然后您需要使用小于或等于,最后您需要递归保留您取出的第二个元素。

【讨论】:

  • 该问题为您提供了所需的 q8 谓词,您无法重新定义括号内的内容,并且必须按原样使用 q8。
  • @cicero866:将上面的第三条规则重写为q8([H1|T]) :- T=[H2|_Ts], H1=&lt;H2, q8(T).。表达方式相同,只是写法不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
  • 2018-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多