Пролог заменяет элемент в списке другим списком
* Привет, я пытаюсь заменить элемент из списка другим списком, и я застрял, когда турбо-пролог дает мне синтаксическую ошибку в случае, если, если 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
, Он возвращается на один уровень вниз и добавляет заголовок начального списка к заголовку результата замены.
Как примечание, оператор вырезания !
редко необходимо. В случае возникновения этой проблемы, вы определенно можете обойтись без нее.