2

*こんにちは、リストの要素を別のリストに置き換えようとしていますが、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 コードを使用)

4

1 に答える 1

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は入ってくる空のリストを扱います。シングルトン変数をアンダースコアに置き換えることを除いて、それはあなたのものと同じです(強く推奨される方法)
  • 2 番目の規則は、Val置換される値がリストの先頭にある状況を扱います。末尾の値を置き換え、置換リストReplを replacement の結果と連結しResます。
  • 最後のルールは、head の値が と一致しない場合の状況を扱いますVal。1 レベル下に再帰し、初期リストの先頭を置換結果の先頭に追加します。

補足として、cut オペレーター!が必要になることはめったにありません。この問題が発生した場合は、それなしで間違いなく実行できます。

于 2012-10-12T14:54:24.840 に答える