0

Prolog を使い始めたばかりで、複数の述語を扱う方法がわかりません。たとえば、次の問題を解決する必要があります。リスト内の値を別のリストのすべての要素に置き換えます。これは私がこれまでに書くことができたコードです:

domains
    elem=integer
    list=elem*

predicates
    %append to a list already created another list. There are 3 list parameters 
    %because I don't know other method 
    append (list,list,list)
    %This will search the list (the first one) for the searched element and   
    %it is it will replace it with the list(the second one). The result will be
    %kept in the third list.
    add(list,list,elem,list)

goal
    add([1,2,3,2,1],[4,5],2,L),
    write (L).  
clauses
    add ([],[_],_,[]).
    add ([A|L],L1,E,[A|L2]):-
        add(L,L1,E,L2).
    add ([E|L],L1,E,L2):-
        add(L,L1,E,L2).
    append([],[],L2).
    append([],[X|L1],[X|L2]):-
        append([],L1,L2).
4

1 に答える 1

1

あなたのappend定義は機能していますか?あるべきだと思います

append([], L, L).
append([X|Xs], Ys, [X|Zs]):-
        append(Xs, Ys, Zs).

述語はappend、Prolog プログラミングで最も基本的なツールの 1 つであり、通常の動作を維持するか、名前を変更することをお勧めします...

の代わりにadd、より適切な名前がreplace_elem_with_list. それを実装するには、反復して各要素を検査し、置換に必要なものと一致するものが見つかったら、要素をコピーする代わりにリストを追加する必要があります。

何かのようなもの

% replace_elem_with_list(ToSearch, Replacement, SoughtElem, Result)
replace_elem_with_list([E|Es], Replacement, E, Result) :-
  !, replace_elem_with_list(Es, Replacement, E, Rs),
  append(Replacement, Rs, Result).

カバーする必要がある他の2つのケースを残します(要素が一致しない場合と、追加に似た再帰ベースの場合)

結果:

?- replace_elem_with_list([1,2,3,4,2,3,4],[a,b],2,L).
L = [1, a, b, 3, 4, a, b, 3, 4].
于 2012-10-15T20:01:32.383 に答える