Мое базовое определение
use_module(library(clpfd)).
/* base definitions */
ice_cream(vanilla).
ice_cream(chocolate).
ice_cream(strawberry).
Превращение слов в целые числа
/*get falavor position */
icecream_index(Icecream,Icecreamlist,Start,End) :-
var(Icecream),
Icecream in Start .. End.
icecream_index(Icecream,Icecreamlist,Start,End) :-
\+ var(Icecream),
nth0(StartEnd,Icecreamlist,Icecream),
Icecream is StartEnd,
Icecream in StartEnd .. StartEnd.
Основная программа, которая генерирует все комбинации
/* generate all combinations of ice cream */
icecream_menu(MenuList) :-
MenuList = [Toppingone, Toppingtwo, Toppingthree],
findall(X,ice_cream(X),Icecreamlist),
length(Icecreamlist, Icecreamcount),
Icecreamstart is 1,
Icecreamend is Icecreamcount,
icecream_index(Toppingone,Icecreamlist,Icecreamstart,Icecreamend),
icecream_index(Toppingtwo,Icecreamlist,Icecreamstart,Icecreamend),
icecream_index(Toppingthree,Icecreamlist,Icecreamstart,Icecreamend),
all_different(MenuList),
label(MenuList).
Когда я вызываю MenuList (X) давая пустую переменную, она может генерировать все возможные комбинации, однако, когда я даю ей список, MenuList([vanilla, X, Y])
он просто терпит неудачу, когда он должен генерировать все комбинации мороженого, начиная с ванили.
Вторая проблема Я не могу понять, как превратить целое число в слова, поэтому вместо получения Menu = [1, 2, 3] я хочу получить Menu = [vanilla, chocolate, strawberry].