【问题标题】:Prolog doesn't return a valueProlog 不返回值
【发布时间】:2017-12-17 21:52:15
【问题描述】:

我有以下代码:

pair_list([X,Y],[[X,Y]]).
pair_list([E,Z|X],[K|Y]):- [E,Z]==K, pair_list(X,Y).

当我运行它时,它会为

提供正确的输出
?- pair_list([1, 2, 3, 4, 5, 6], [[1, 2], [3, 4], [5, 6]]).
true ;

但是当我运行时

?- pair_list([1,2, 3, 4, 5, 6], X).

我刚收到false.

我的问题是为什么我没有收到X=[[1, 2], [3, 4], [5, 6]]

【问题讨论】:

  • ==(比较)更改为=(或将[E,Z]移到头部)。

标签: prolog


【解决方案1】:

你快到了:你需要做的就是将[E,Z]移到头部,消除K

pair_list([X,Y],[[X,Y]]).
pair_list([E,Z|X],[[E,Z]|Y]) :- pair_list(X,Y).

Demo 1.

请注意,base 子句可以替换为基于空列表的子句:

pair_list([], []).
pair_list([E,Z|X],[[E,Z]|Y]) :- pair_list(X,Y).

Demo 2.

另请注意,您的程序不能处理包含奇数项的列表。为了解决这个问题,添加一个单独的基本子句来处理包含单个项目的列表,方法是删除项目,与某个固定原子配对,或者做一些你认为在这种情况下有用的其他事情。

【讨论】:

  • 如果列表有奇数个项目,失败更有意义。
  • @TomasBy 取决于 OP 的要求,可能会出现列表需要填充一些值的情况。
  • 如果我们假设 OP 的意思是他写它的方式,那么这似乎表明当长度为奇数时要求失败。
猜你喜欢
  • 1970-01-01
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多