尝试逐步以递归方式理解列表

时间:2018-02-15 01:25:39

标签: prolog

concatenar([], Xs, Xs).
concatenar([X|Xs],Ys,[X|Zs]) :- concatenar(Xs,Ys,Zs).

?- concatenar([a, d, c], [s, a, d], Z).
Z = [a, d, c, s, a, d]

?- concatenar(T, [s, a, d], [a, d, c, s, a, d]).
T = [s, a, d]
% Mínimo elemento de una lista
%Ejemplo: minimo([1,5,3,-2],X). X=-2

minimo([X], X).
minimo([X|Xs], X) :- minimo(Xs,Y), X =< Y.
minimo([X|Xs], N) :- minimo(Xs,N), N < X.

1 个答案:

答案 0 :(得分:0)

我将帮助您完成第一个示例。这应该给你足够的信息来解决你自己的问题...

这是你的谓词:

concatenar([], Xs, Xs).
concatenar([X|Xs], Ys, [X|Zs]) :- concatenar(Xs,  Ys, Zs).

现在考虑查询:

?- concatenar([a,b,c], [x,y,z], L).

Prolog将从您的&#34;数据库开头#34; (断言事实和谓词)试图将查询词与事实和谓词头统一起来。第一次尝试是concatenar([], Xs, Xs)。 Prolog无法将查询字词与此规则统一起来,因为[]未与[a,b,c]统一。所以Prolog继续前进到下一个谓词头concatenar([X|Xs], Ys, [X|Zs]) ...。在此处,它可以通过[a,b,c] = [X|Xs]X = a统一Xs = [b,c],它可以按原样统一[x,y,z] = Ys,并按原样统一L = [X|Zs]。由于它通过统一匹配了这个谓词条款的头部,Prolog将继续执行该条款的主体,并通过头部的统一调用concatenar(Xs, Ys, Zs) concatenar([b,c], [x,y,z], Zs)

现在再次重复这个过程。您有一个新查询concatenar([b,c], [x,y,z], Zs)尝试与第一个头concatenar([], Xs, Xs)统一。不匹配,因为[b,c]未与[]统一。和以前一样,Prolog转到下一个子句,并通过concatenar([b,c], [x,y,z], Zs)concatenar([X|Xs], Ys, [X|Zs])X = bXs = [c]Ys = [x,y,z]Zs = [X|Zs']统一起来(注意,我使用Zs'来区分这是一个与另一个Zs不同的变量的事实。同样,和以前一样,Prolog将继续执行该条款的主体并致电concatenar([c], [x,y,z], Zs')

如果您继续执行此流程,则最后将concatenar([], Xs, Xs)concatenar([], [x,y,z], [x,y,z])匹配。然后你必须解除递归......

我们是如何接听concatenar([], [x,y,z], Zs)的电话的?它来自对concatenar([c|[]], [x,y,z], [c|Zs]) :- concatenar([], [x,y,z], Zs).的来电。因此,当此次来电回来时,会产生concatenar([c|[]], [x,y,z], [c|[x,y,z]])concatenar([c], [x,y,z], [c,x,y,z])

我们是如何接听电话的?它来自concatenar([b|[c]], [x,y,z], [b|Zs]) :- concatenar([c], [x,y,z], Zs)的电话。因此,这会产生concatenar([b|[c]], [x,y,z], [b|[c,x,y,z]])concatenar([b,c], [x,y,z], [b,c,x,y,z])

此来自concatenar([a|[b,c]], [x,y,z], [a|Zs]) :- concatenar([b,c], [x,y,z], Zs).来自concatenar([a|[b,c]], [x,y,z], [a|[b,c,x,y,z]])concatenar([a,b,c], [x,y,z], [a,b,c,x,y,z])

多田!它已经完成了。