Планирование пролога с использованием retract и assert

karlosss спросил: 11 марта 2019 в 07:33 в: prolog

Интересно, можно ли выполнять планирование в Prolog, используя базу знаний, измененную с помощью retract и assert во время выполнения?

Моя идея заключается в следующем: предположим, что мне нужно заменить спущенную шину машина. Я могу либо положить что-нибудь на землю, либо перенести что-нибудь с земли в какое-нибудь свободное место.

Поэтому я придумал такой код:

at(flat, axle).
at(spare, trunk).free(Where) :- at(_, Where), !, fail.
remove(What) :- at(What, _), retract(at(What, _)), assert(at(What, ground)).
put_on(What, Where) :- at(What, _), free(Where), retract(at(What, _)), assert(at(What, Where)).

( Я новичок в Прологе, так что, может быть, это даже неправильно, если да, посоветуйте мне, пожалуйста, как это исправить.)

Идея такова: у меня спущенная шина на оси и запасная в багажник. Я могу удалить вещь X, если X где-то есть, и удалить ее, я убираю факт, указывающий, где она находится, и добавляю факт, что она на земле. Точно так же я могу поместить вещь X в местоположение Y, если X где-то и Y свободен, и для этого я удаляю X из того места, где она есть, и добавляю факт, что X находится в Y.

И теперь Я застрял: я понятия не имею, как использовать этот код сейчас, так как at(spare, axle) просто говорит нет, даже с трассировкой.

Так что вопрос: можно ли использовать такой подход, и если Итак, как?

Надеюсь, это имеет смысл.

0 ответов