假设我有一个序言程序来连接这样的列表:
concat([],X,X).
concat([Head|Tail],X,[Head|R]) :- concat(Tail,X,R).
我怎么知道哪些问题会返回有限数量的答案?例如,询问
concat(X,Y,[1,2,3,4]).
将返回有限解集:
X = [],
Y = [1, 2, 3, 4] ;
X = [1],
Y = [2, 3, 4] ;
X = [1, 2],
Y = [3, 4] ;
X = [1, 2, 3],
Y = [4] ;
X = [1, 2, 3, 4],
Y = [] ;
false.
在提出问题的同时
concat(X,[2,3],Z).
将返回一组无限的解决方案:
X = [],
Z = [1, 2, 3] ;
X = [_G24],
Z = [_G24, 1, 2, 3] ;
X = [_G24, _G30],
Z = [_G24, _G30, 1, 2, 3] ;
X = [_G24, _G30, _G36],
Z = [_G24, _G30, _G36, 1, 2, 3] ;
X = [_G24, _G30, _G36, _G42],
Z = [_G24, _G30, _G36, _G42, 1, 2, 3] ;
X = [_G24, _G30, _G36, _G42, _G48],
Z = [_G24, _G30, _G36, _G42, _G48, 1, 2, 3] ;
X = [_G24, _G30, _G36, _G42, _G48, _G54],
Z = [_G24, _G30, _G36, _G42, _G48, _G54, 1, 2, 3]
依此类推(基本上,每个可能的列表都以 [1,2,3] 结尾。
那么我如何推断逻辑程序上哪些问题会结束呢?