Пролог заменяет элемент в списке другим списком

* Привет, я пытаюсь заменить элемент из списка другим списком, и я застрял, когда турбо-пролог дает мне синтаксическую ошибку в случае, если, если C=A-> поместить в список результатов (L1) список, который заменяет элемент.

domains
    list=integer*
    element=i(integer);l(list)
    lista=element*
predicates
    repl(list,integer,list,lista)
clauses
    repl([],A,B,[]):-!.
    repl([C|L],A,B,**[l(|L1])**:- C=A,repl(L,A,B,L1),!.
    repl([C|L],A,B,[i(C)|L1]):- repl(L,A,B,L1),!.

Спасибо за помощь, проблема решена (с помощью кода dasblinkenlight)

1 ответ

Решение

Попробуй это:

concat([],L,L).
concat([H|T],L,[H|Res]) :- concat(T,L,Res).

repl([],_,_,[]).
repl([Val|T],Val,Repl,Res) :- repl(T,Val,Repl,Temp), concat(Repl,Temp,Res).
repl([H|T],Val,Repl,[H|Res]) :- repl(T,Val,Repl,Res).

Я не знаю, будет ли он работать в Turbo Prolog, но он хорошо работает в SWI и не использует никаких встроенных предикатов.

concat/3 пара правил объединяет списки в позициях 1 и 2 в результирующий список в позиции 3.

  • Первый repl имеет дело с входящим пустым списком; он идентичен вашему, за исключением того, что он заменяет одноэлементные переменные подчеркиванием (настоятельно рекомендуется)
  • Второе правило касается ситуации, когда значение Val заменяемый находится во главе списка; он заменяет значения в хвосте и объединяет список замен Repl с результатом замены Res,
  • Последнее правило касается ситуации, когда значение головы не соответствует Val, Он возвращается на один уровень вниз и добавляет заголовок начального списка к заголовку результата замены.

Как примечание, оператор вырезания ! редко необходимо. В случае возникновения этой проблемы, вы определенно можете обойтись без нее.

Другие вопросы по тегам