用函子在Prolog中追加列表

用函子在Prolog中追加列表,prolog,append,functor,Prolog,Append,Functor,我第一次尝试使用Prolog的append和length谓词来拆分列表,我相信这需要一个递归解决方案。我是Prolog新手,希望在初学者问题上得到一些帮助!:) 以下是预期的代码输出: ?- splits([1,2,3],S). S = [1]/[2, 3] ; S = [1, 2]/[3] ; false. 它获取一个列表并将其拆分,但它是通过使用functor/创建一个结构来实现的,这就是迄今为止让我感到困惑的地方。。。我知道我需要使用append来实现这一点,但是如何实现呢 以下是我目前

我第一次尝试使用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函数或使其递归。。。有人能给我小费吗?:)

我想说的是,您的评论是,
append/3
可以用于拆分列表,这几乎是一个可行的实现。这确实是实例化
(-,+)
中的
append/3
所做的

在您的问题中,唯一增加的要求似乎是排除任何拆分为空的情况。这可以通过使用
\==/2
检查术语之间的不等价性来实现

这将产生以下代码:

splits(List, X/Y):-
  append(X, Y, List),
  X \== [],
  Y \== [].
注意,在代码片段中使用
len
是错误的,因为
len
不是一个Prolog变量,而是一个atom。将原子传递给
length/2
的第二个参数会产生类型错误,并在
len>0
中产生算术错误(前提是
len
未定义为函数)。(两项观察结果均与SWI序言有关。)


希望这有帮助

这里是一种递归方法:

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
强制的两个)


append的使用在这里帮助很大!感谢您帮助理解列表连接:)
| ?- 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

...