問題があります。私はreplace(E1、L1、E2、L2)述部を実装したいと思います。 これは、L1とL2が同じリストである場合を除いて、L1がE1、L2にE2を持つ1つの場所を除きます。さらに、1つのオカレンスだけが置換され、どのモードでも動作する必要があります。例えばエラー:グローバルスタックにappend/3があります。
:
replace(2,[1,2,3,4],5,X)
が唯一の解決策X = [1,5,3,4]
を持つ必要があります。
replace(2,[1,2,3,2,1],5,X)
は、ソリューションX = [1,5,3,2,1]
とX = [1,2,3,5,1]
をバックトラックする必要があります。
replace(2,X,5,[1,5,3,5,1])
は、ソリューションX = [1,2,3,5,1]
とX = [1,5,3,2,1]
をバックトラックする必要があります。
replace(X,[a,b,c,d],Y,[a,e,c,d])
には、解決策X = b, Y = e
が必要です。
replace(X,[1,2,3,2,1],Y,[1,5,3,5,1])
には解決策がありません( は失敗するはずです)。
私の実装:
replace(E1, L1, E2, L2) :-
append(X, [E1|L_Tail], L1),
append(X, [E2|L_Tail], L2).
このコードは結構です。ただし、replace(2,X,5,[1,5,3,5,1])
の場合は、X = [1,2,3,5,1]
とX = [1,5,3,2,1]
とfalse
が返されます。最初の2つの結果しか返さず、false
が出てこなかった。プログラムはERROR: Out of global stack
になります。
こんにちはボリスを、 。あなたの答えは明確で整然としたものです。大変ありがとう! –