私はPrologを使い始めていますが、私はそれが期待どおりに動作しない理由を理解できません。 リストL2がL1に含まれている場合にtrueを返す述語を作成しようとしています。 これは私が書いたものである:Prolog述語の問題
assert(contains (L1, L1)).
assert(contains(L1, [X|L2]):-member(X, L1), contains(L1, L2)).
assert(contains(L1, [])).
私は、これは「『L3は= X | L2は』 Xの場合はL1であり、また、L2がL1で、その後真である」と同等になります考え出し含まれていると(、 L1、L2)は、すべてのメンバがトラバースされ、最後のオプションが残されるか、またはL1にないメンバを見つけるまで再帰的に変換され、述語には失敗します。
残念ながら、それはそのように動作していないようです。 ([1,2,3]、[1,4,5])パスは含まれていますが、([1,2,3]、[4、 1,5])はそうではない。
私は間違っていますか?
使用しているPrologの実装は? SWI-Prologで問題を再現することはできません。 – mercator
SWI-Prologバージョン2.7.12 –
2.7.12?本当に?! 5.6.xや5.7.xのような新しいものを試してみてください。 – Kaarel