我试图第一次使用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

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