пролог ярлык clp - игнорировать какую-то переменную? - PullRequest
0 голосов
/ 03 апреля 2020

Мое базовое определение

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].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...