Я пытаюсь попрактиковаться со списком в Прологе.
На самом деле я пытаюсь сделать следующее:
Получить все комбинации элементов в списке,
определить, является ли результирующий список длиннее, чем список ввода. Вот код:
%
descartes([],[],false).
descartes(X,Result,IsExist):-
i_think(X,Result),
i_exists(X,Result,IsExist).
%should concatenate all combinations of input list
i_think([],NULL).
i_think([X|Xs],S):-
Y = Xs,
Y1 = X,
concatenate([X,Y1],Z1),
i_think(Y,T),
i_think(Xs,U),
S = [Z1,T,U].
%
concatenate([X,Y],R):-
atomics_to_string([X,Y],T),
atomics_to_string([Y,X],U),
R= [T,U].
%
i_exists(X,Y,false):-
len(X,Y,2);
len(X,Y,1).
i_exists(X,Y,true):-
len(X,Y,0).
%
len(X,Y,Count) :-
length(X,K),
length(Y,I),
(
(
K < I,
Count is 0
);
(
I < K,
Count is 2
);
(
I = K,
Count is 1
)
).
Основная проблема с i_think / 2, спасибо за любую помощь.
....
Конечно, укажите ввод / вывод и спасибо за ответ:
descartes/3 :
descartes(['gold','bank'],Result,isExist)
Result=['goldgold','goldbank','bankbank','bankgold']
isExist= true
(In fact I would prefer to erase repetitions as...)
descartes(['gold','gold'],Result,isExist)
Result=['goldgold','goldgold','goldgold','goldgold']
(this shouldn't be generated as i_exist would return true)
isExist= false