Я новичок в Prolog, и я пытаюсь использовать его для заказа списка с определенными ограничениями.
Проблема начинается со следующих определений:
Item
— это список длиной 3:[Name, Type, Weight]
.Content
— это список элементов[item_0,.....item_n]
.ContentList
— это списокContent
Например:
С предметами:
item_1 = [chicken, meat, 1.0]
item_2 = [eggplant, vegetable, 0.5]
item_3 = [tomatoes, vegetable, 1.0]
item_4 = [bread, other, 0.2]
Мы создаем два содержания:
contentA = [item_2, item_3]
contentB = [item_1, item_4]
contentC = [item_3, item_4]
Итак, теперь, допустим, у нас есть некоторые определения контента:
hasItemType([_, XType, _], XType).
hasListItemType([H|T], Type) :-
hasItemType(H, Type);
hasListItemType(T, Type).
hasListOnlyItemType([H|T], Type) :-
hasItemType(H, Type),
hasListItemType(T, Type)
isVegetarian(Content) :- hasListOnlyItemType(Content, vegetable).
hasVegetables(Content) :- hasListItemType(Content, vegetable).
hasMeat(Content) :- hasListItemType(Content, meat).
Цель будет:
Учитывая список Content
, возвращает ContentList
, который лучше всего соответствует определенному порядку:
Например (но, таким образом, мой вопрос, я не уверен, что это правильный способ сделать это.)
-> `order(A, B)` A is before B in the output list.
order(ContentA, ContentB) :-
isVegetarian(ContentA),
hasVegetables(ContentB).
order(ContentA, ContentB) :-
hasVegetables(ContentA),
hasMeat(ContentB).
В идеале я хотел бы что-то вроде этого:
solve([contentB, contentC, contentA])
чтобы вернуть [contentA, contentB, contentC]
потому что: порядок (содержание A, содержимое B), порядок (содержимое A, содержимое C), порядок (содержимое B, содержимое C)
Итак, у меня есть два основных вопроса:
- Это разумный способ формализовать мою проблему.
- Как только
order
и ограничения будут правильно определены, как можно будет написать решатель?
Я понимаю, что мой вопрос немного широк, поэтому я приму любые предложения, ссылки, идеи;)
Заранее спасибо, если вы это прочитаете!