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.
答案 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 = b
和Xs = [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])
。
多田!它已经完成了。