我正在尝试在Prolog中创建这个函数:
% Signature: circleList(L1, L2)/2
% Purpose: L2 is a "circled" L1 list.
% Precondition: L1 is fully instantiated.
% Examples:
% ?- circleList([2, 3, 4, 5], X).
% X = [2, 3, 4, 5];
% X = [3, 4, 5, 2];
% X = [4, 5, 2, 3];
% X = [5, 2, 3, 4];
% false.
所以我做了这个:
circleList([],[]).
circleList(X,X).
circleList([H|T],R):- append(T,[H],S), circleList(S,R).
但输出结果是这样的:
X = [2, 3, 4, 5] ;
X = [3, 4, 5, 2] ;
X = [4, 5, 2, 3] ;
X = [5, 2, 3, 4] ;
X = [2, 3, 4, 5] ;
X = [3, 4, 5, 2] ;
X = [4, 5, 2, 3] ;
X = [5, 2, 3, 4] ;
X = [2, 3, 4, 5] ;
X = [3, 4, 5, 2]
and so on...
这很好,但我希望它在第一次后停止,我正在尝试所有可能性。
我该怎么办?
circleList(L,[1,2])
会产生冗余解决方案,例如circleList([1,2],L)
。 - falseappend(A, B, L).
具有两个未绑定变量A
,B
,对于所有连接起来得到结果L
的列表A
,B
都满足。(例如:?- append(A,B,[a,b,c]). A = [], B = [a, b, c] ; A = [a], B = [b, c] ; A = [a, b], B = [c] ; A = [a, b, c], B = [] ; false.
) - Tudor Berariu