Я хочу написать программу, которая оценивает, какие комбинации предметов можно переносить в пределах определенной емкости мешка. Важная часть программы - выбить все перестановки возможностей. Программа должна выдавать каждую возможность один раз, а не их перестановки. Вот пример запрос:Как написать findall без перестановок?
?- place(Possibility, 2).
Possibility = [water];
Possibility = [flower];
Possibility = [paper];
Possibility = [meat];
Possibility = [wood];
Possibility = [glass];
Possibility = [water, flower];
Possibility = [water, paper];
Possibility = [flower, paper].
Мой код до сих пор:
% item(Name, Space)
item(water, 1).
item(flower, 1).
item(paper, 1).
item(meat, 2).
item(wood, 2).
item(glass, 2).
item(stone, 3).
item(gold, 3).
item(metal, 3).
item(platin, 4).
% maximum capacity of bag
maxcapacity(10).
place(Possibility, Capacity) :-
maxcapacity(MaxCapacity),
between(1, MaxCapacity, Capacity),
possibilities(Capacity, [], Possibility).
possibilities(Capacity, Acc, Acc) :-
\+ (space(Possibility, [], 0, Capacity), sort(Possibility, SortedPossibility), \+ member(SortedPossibility, Acc)).
possibilities(Capacity, Acc, PossibilityList) :-
space(Possibility, [], 0, Capacity),
sort(Possibility, SortedPossibility),
not(member(SortedPossibility, Acc)),
Acc1 = [SortedPossibility|Acc],
possibilities(Capacity, Acc1,PossibilityList).
space(Acc, Acc, Space, MaxCapacity) :-
Space =< MaxCapacity,
Acc \= [].
space(Possibility, Acc, Space, MaxCapacity) :-
item(Item, ItemSpace),
not(member(Item, Acc)),
NewSpace is Space + ItemSpace,
NewSpace =< MaxCapacity,
Acc1 = [Item|Acc],
space(Possibility, Acc1, NewSpace, MaxCapacity).
Я пытался выгнать перестановки сортировки, но программа все еще дает мне все перестановки и помещает комбинацию записи как-то в список. Программа должна работать так же, как в примере выше.
Я бы очень признателен за любую помощь!
Ваш пример запроса не работает с вашим кодом: запрос предназначен для предиката 'space/2', но вы определяете только' space/4'. Существует «место/2», но оно также ведет себя иначе, чем вы показываете. –
Извините, я имел в виду «место (возможность, 2)». Я редактировал свой пост. – zer0kai
Я неправильно понял ваш «пример запроса». Я думал, вы хотели сказать, что это пример того, как ведет себя ваша программа, но это был пример того, как вы себя ведете. Возможно, вы могли бы отредактировать сообщение, чтобы это немного разъяснить. –