私は「プロローグの芸術」の本を読んでいて、「補助述語を使用せずに、SumがListOfIntegersの合計である場合に成立する関係sum(ListOfIntegers、Sum)を定義する」という演習を見つけました。このソリューション:
sum([],Sum).
sum([0|Xs], Sum):-sum(Xs, Sum).
sum([s(X)|Xs], Sum):-sum([X|Xs],s(Sum)).
これは、私が望んでいたとおりには機能しません。
?- sum([s(s(0)),s(0),s(s(s(0)))],X).
true ;
false.
私はXが
s(s(s(s(s(s(0))))))
問題は、最初の「反復」で「Sumを0に初期化する」必要があることだと思いましたが、それは非常に手続き的であり、残念ながら、私はそれを機能させるためのプロローグにはあまり適していません。何かアイデアや提案はありますか?