式を分解する述語があり、それをトレースすると理解できない結果が得られます。
私の述語は以下の通りです
calc(R,Expr) :- Expr =..[Op,H,T].
したがって、[1,1]のような式がある場合、Opは実際にはピリオドです。なぜですか?
式を分解する述語があり、それをトレースすると理解できない結果が得られます。
私の述語は以下の通りです
calc(R,Expr) :- Expr =..[Op,H,T].
したがって、[1,1]のような式がある場合、Opは実際にはピリオドです。なぜですか?
これは、フォーム[Head|Tail]
が単なる構文糖衣であるためです'.'(Head, Tail)
(すべてが用語であり、リストも例外ではありません)。通常、、、、およびで構成されるリストの場合は1
、次のように記述する必要があります。2
3
4
'.'(1, '.'(2, '.'(3, '.'(4, [])))).
ご覧のとおり、これはあまり実用的ではなく、代わりにショートカットを使用します。
[1|[2|[3|[4|[]]]]]
そして、このショートカットにはショートカットがあります。
[1, 2, 3, 4]
そして、あなたはあなたが望むようにそれらを混ぜることができます:
[1, 2|[3, 4]]
これは、いくつかの要素を指定してからテールを解放する場合に便利です。
[1, 2|A]
ところで、あなたはそれをあなた自身のために使うことによって見ることができますwrite_canonical/1
:
?- write_canonical([1, 2, 3, 4]).
'.'(1,'.'(2,'.'(3,'.'(4,[]))))
true.
お役に立てば幸いです