Пролог термин конкатенация - PullRequest
0 голосов
/ 10 июня 2010

Я пытаюсь отформатировать результат из программы, но мне трудно.

Я хотел бы дать что-то вроде этого в результате:

Res = do(paint(x) do(clean(a), do(repair(b) , initialState)))

В принципе, я хочу объединить последовательные термины в initialState atom, но он не работает с atom_concat, поскольку другие термины для объединения не являются атомами, и я также хотел добавить) каждый раз, когда я прохожу через функцию "do" .

Так что это будет что-то вроде: Res = initialState.

Когда вызывается функция do, у меня будет такая функция, как

concatenateTerm(Pred, Res, Res).

Например, предварительно отремонтировать (b) и получить результат: res = do(repair(b), initialState).

Возможно ли это сделать?

Спасибо

Ответы [ 3 ]

1 голос
/ 16 июня 2010

Если я вас правильно понимаю, вам нужно сделать что-то вроде:

Res0 = initialState,
do(repair(b), Res0, Res1),
do(clean(a), Res1, Res2),
do(paint(x), Res2, Res3),

, где ваш конечный результат в Res3.Помните, что прологические процедуры ничего не «возвращают», а входные и выходные значения должны передаваться через аргументы.

Почему вы хотите объединить последовательные термины с atom initialState?Это не пролог.В прологе было бы гораздо более естественным построить структуру, которая будет изменяться каждый раз.

1 голос
/ 16 июня 2010

Я согласен с @rvirding в том, что вам может потребоваться просто создать PROLOG term в качестве результата, вместо того, чтобы пытаться создать atom . Даже если вы попробуете последнее (что действительно возможно), вы обычно можете конвертировать из атомов в термины и обратно, используя вспомогательные функции (такие как atom_to_term/3 или term_to_atom/2 в SWI-PROLOG), при необходимости.

В любом случае, простой предикат, содержащий полный список терминов «состояния» и выводящий такой термин, как вы описали ранее, может выглядеть так:

build_do_term([X,Y], do(X,Y)) :- !.
build_do_term([X|Xs], do(X,Rem)) :-
    build_do_term(Xs, Rem).

Вызов этого предиката в терминах состояния (которых должно быть не менее двух):

?- build_do_term([paint(x), clean(a), repair(b), initialState], Rem).
Rem = do(paint(x), do(clean(a), do(repair(b), initialState))).

... который отражает поведение, которое вы описали как последующее. Если вы не хотите создавать термин все сразу из списка, вы все равно можете использовать do/2 метод построения термина, который используется в build_do_term/2 выше в вашем собственном коде, чтобы создать соответствующий do/2 термин по мере необходимости.

0 голосов
/ 11 июня 2010

@ d0pe, в прологе нет результатов (они существуют в Меркурии и Эрланге, я полагаю), есть только именованные значения, которые указаны / объединены в голове и, вероятно, позже объединены в теле.Выполнение Temp = Res, concatenateTerm (Pred,Temp, Res) в большинстве случаев не удастся, потому что Temp = Res, Res = do(Pred, Temp) будет производить бесконечно рекурсивный термин do(Pred, do(Pred, do(Pred, ...))) (при наличии соответствующего расширения).Я думаю, что это не то, что вы хотите.
Но теперь я понимаю, что вы хотите изменить Res - это неверное понимание Пролога.Переменных нет, вам следует использовать следующий подход Res0 = initialState, Res1 = do(repair(b), Res0), Res2 = do(clean(a), Res1), Res3 = do(paint(x), Res2).

Возможно, ваше правило будет выглядеть примерно так (см. Примеры обезьяны + банан в прологе):

solve(FinalState, finish, FinalState). % our initial state is our goal

solve(InitState, do(Action, Future), FinalState):-
  action(InitState, Action, NewState),
  solve(NewState, Future, FinalState).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...