次のようなリストを連結するプロローグ プログラムがあるとします。
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] で終わる可能性のあるすべてのリスト。
では、論理プログラムでどの質問が終了するか、または終了しないかをどのように判断できますか?