我试图第一次使用Prolog的append和length谓词来拆分列表,我相信它需要递归解决方案。 我是Prolog的新手,并希望对此入门问题有所帮助! :)

这是预期的代码输出:

?- splits([1,2,3],S).
S = [1]/[2, 3] ;
S = [1, 2]/[3] ;
false.

它需要一个列表并将其拆分,但是通过使用functor /创建一个结构来做到这一点,到目前为止,这一直让我感到困惑。我知道我需要为此使用append,但是如何做到这一点呢?

到目前为止,这是我的代码:

splits([H | T], S) :-
    length(T, len), len > 0,

它将一直运行到列表的尾部为空,然后停止,但是我还不太清楚如何添加append函数或使其递归...有人可以给我一个提示吗? :)

===============>>#1 票数:2 已采纳

我要说的是您几乎处于可行的实现中,请注意append/3可用于拆分列表。 这确实是实例化(-,-,+)中的append/3所做的事情。

您的问题中似乎唯一出现的附加要求是排除其中任何一个拆分为空的情况。 这可以通过使用\\==/2检查项之间的不等式来实现。

这将导致以下代码:

splits(List, X/Y):-
  append(X, Y, List),
  X \== [],
  Y \== [].

PS:请注意,您在代码段中使用len是错误的,因为len不是Prolog变量而是原子。 将原子传递给length/2的第二个参数会产生类型错误,并且在len > 0会产生算术错误(假设len未定义为函数)。 (两个观察都与SWI-Prolog有关。)

希望这可以帮助!

===============>>#2 票数:0

这是一种递归方法:

splits([A,B|T], [A]/[B|T]).
splits([A|T], [A|R]/S) :-
    splits(T, R/S).

第一条提供了将具有至少2个元素( [A,B|T] )的列表拆分为[A]/[B|T] (仅拆分第一个元素)的基本情况。

第二个子句表示, [A|R]/S是的分割[A|T]如果R/S是的分割T 因此它将“生成”递归到基本情况的其他解决方案。 如果第一个列表只有两个元素,则基本情况将成功,并且在第一次尝试时回溯到递归情况将失败(这是您想要的-该情况不再需要解决方案),因为递归情况仅在以下情况下成功:第一个列表具有3个或更多元素( A加上递归查询中对T强制执行的两个元素)。

| ?- splits([1], S).

no
| ?- splits([1,2], S).

S = [1]/[2] ? ;

no
| ?- splits([1,2,3], S).

S = [1]/[2,3] ? ;

S = [1,2]/[3] ? ;

no

...

  ask by user3290526 translate from so

未解决问题?本站智能推荐:

1回复

如何访问嵌套函子中的特定值(Prolog)

假设我们有以下嵌套函子列表: 找出move(1,a)是否在此列表中或者如果我们知道move(1, _)在其中的正确语法是什么,如何确定_的值是什么? 我知道我们可以使用成员函数来查找c是否在函子列表中,但是我们如何将其应用于嵌套函子列表呢?
2回复

如何在Prolog中使用函子名称(如变量)?

我们的Prolog课程有这项作业。 每周Prolog的工作时间为两个月,这对我来说仍然是一个谜,但我的想法似乎无法适应过程语言。 有一个知识库,其中包含具有相同名称和Ar1、1、2和3的谓词/函子。调用表应为 搜索(函数名,参数,S)。 答案应该找到所有带有此函子名称和
1回复

检查列表中的函子

如果我有这个: 如何检查第二个参数是什么,例如v(1,x) (在本例中为x )? 一旦我有了列表的头: [Head | Tail] [Head | Tail] , Head = [v(1,x)] ,如何检查?
1回复

在Prolog中,谓词

以下Prolog目标是否令人满意? 我找到了一个Prolog文档,问了这个问题,答案是:“不,这个目标在语法上是不正确的”,但是当我在SWI-Prolog中尝试它时,它没有显示任何错误,因此它给了我答案。符合逻辑: 那有什么我想念的吗? 还是文件答案是错误的?
2回复

如何在Prolog的嵌套列表中追加1个元素?

我想在嵌套列表中追加一个列表元素: 例如: Turbo Prolog说:输入错误。 我怎样才能做到这一点?
1回复

Prolog转换为大写字母

好吧,我想询问是否有任何方法可以将小写字母更改为大写而不添加“”。 对不起,如果这听起来很傻,但我需要这个来运行另一个程序。 我写了这样的东西: 我需要输出看起来像: 但它看起来像这样: 我将衷心感谢您的帮助!
2回复

Prolog将变量追加到列表

我想将一个绑定到数字的变量N附加到列表中。 我想得到Z = [1,2,3,4] 如何附加变量的数字部分,而不是实际变量本身?
1回复

序言:用复合术语将一个原子替换为其他原子

我正在尝试编写一个简单的序言程序,该程序应将一个原子替换为另一个原子。 该程序可以将复杂的函子作为输入,并将所有原子替换为另一个原子。 例如,在下面的术语中,我只想在遇到叶子(而不是函子名称)的地方用ax替换a原子。 应该产生输出 在上面的输出中,除函子名称之外的所有地方
1回复

序言:将列表中的元素追加到列表

我正在尝试创建一个给定的程序:Combine([[[1],[2,3]],Q)。 它将生成:Q = [1,2,3]。 换句话说,如果给我一个元素列表,则需要将所有元素附加到一个列表中。 并非每个元素都可能是一个列表,所以我必须让任何非列表元素成为列表,以便可以追加。 列表元素中包含的其
1回复

Prolog在列表中附加列表

我有一个列表列表,我想添加更多列表。 假设我有一个列表: 我想附上一份清单 它应该怎么做? 'append'会把它当作: 我写了一个这样的函数: 但它把新列表放在旧列表之前,我想颠倒顺序。