Хорошо, вот сделка:
- У меня две кучи рубашек
- Я хочу взять случайную рубашку из каждой кучи и положить ее в новую кучу
- Тогда достаньте новую кучу
И вот код:
mix([],[],_).
mix(P1,P2, Pile):-
takeshirt(P1,1,Taken1,Rem1), takeshirt(P2,1,Taken2,Rem2), #Take one
append(Pile,Taken1,New), append(New,Taken2,NewPile), #Put both of them
mix(Remain1,Remain2,NewPile).
Вот как будет выглядеть результат:
1 ?- mix([a,b],[c,d],NewPile).
NewPile = [] .
Я хочу, чтобы это выглядело так:
1 ?- mix([a,b],[c,d],NewPile).
NewPile = [b, d, a, c] .
Или каков бы ни был результат.Я проверил с помощью графического отладчика и обнаружил, что, когда происходит последний вызов mix , привязки:
P1 = Taken1 = [b]
P2 = Taken2 = [c]
Pile = [a, d]
Rem1 = Rem2 = []
New = [a, d, b]
NewPile = [a, d, b, c] #<--- Interresting
Таким образом, требуемое значение находится в NewPile, когда последний вызов:
mix([],[],_).
случается.После этого он рушится как карточный домик.
Итак, вопрос в следующем:
mix([],[],_).
Я бы хотел вернуть значение _ из базового случая, это правило mix фактически используется из более высокого экземпляра, куда я отправляю две стопки и получаю новую кучу.
Обновление:
Чтобы уточнить некоторые комментарии о правиле takehirt вот оно:
takeshirt(_,0,[],_).
takeshirt(List,Number,[Element|Taken],Remain) :- N > 0,
length(List,Len),
Index is random(Len) + 1,
removeshirt_at(Element,List,Index,Remain),
Number1 is Number - 1,
takeshirt(Remain,Number1,Taken,Remain).