これら 2 つのプログラムがありますが、正常に動作していません。最初の without_doubles_2(Xs, Ys) は、Ys が Xs に現れる要素の重複なしのリストである場合に真であることを示すはずです。Y の要素は X の逆順で、最初の重複値が保持されます。without_doubles_2([1,2,3,4,5,6,4,4],X) などは X=[6,5,4,3,2,1] を出力しますが、false を出力します。
without_doubles_2([],[]).
without_doubles_2([H|T],[H|Y]):- member(H,T),!,
delete(H,T,T1),
without_doubles_2(T1,Y).
without_doubles_2([H|T],[H|Y]):- without_doubles_2(T,Y).
reverse([],[]).
reverse([H|T],Y):- reverse(T,T1), addtoend(H,T1,Y).
addtoend(H,[],[H]).
addtoend(X,[H|T],[H|T1]):-addtoend(X,T,T1).
without_doubles_21(X,Z):- without_doubles_2(X,Y),
reverse(Y,Z).
2 つ目は、このプログラムに文字列を使用させる方法です。文字列から母音を削除し、子音のみを出力することになっています。
deleteV([H|T],R):-member(H,[a,e,i,o,u]),deleteV(T,R),!.
deleteV([H|T],[H|R]):-deleteV(T,R),!.
deleteV([],[]).