如何在 Prolog 中实现我自己的列表?
How do I implement my own list in Prolog?
我正在学习 Prolog,我知道已经实现了一个数据结构来处理列表,但我想知道如果出于某种原因我想实现自己的数据结构,我该怎么做?我不期待实现作为答案,但一些想法会很棒。
谢谢。
Prolog 中的列表是带有一些语法糖的复合术语。您可以使用以下查询来揭示规范语法:
| ?- write_canonical([]).
[]
yes
| ?- write_canonical([1,2,3]).
'.'(1,'.'(2,'.'(3,[])))
yes
如果将查询结果与列表数据结构的抽象定义进行比较,可以看到空列表由原子[]
表示,非空列表是'.'/2
复合术语,其中第一个参数是列表元素,第二个元素是列表。
您可以通过定义合适的复合词来定义自己的 "data structures"。一个好的起点是一个简单的二叉树。您将需要空树的表示,例如原子 nil
,以及一个包含三个节点参数的复合术语:节点元素、左树和右树。例如:tree(a, tree(c,nil,nil), tree(f,nil,tree(z,nil,nil)))
。从这个例子中,你能写出谓词吗?遍历树并在节点元素上调用一些谓词?例如。将它们写入标准输出?
我正在学习 Prolog,我知道已经实现了一个数据结构来处理列表,但我想知道如果出于某种原因我想实现自己的数据结构,我该怎么做?我不期待实现作为答案,但一些想法会很棒。
谢谢。
Prolog 中的列表是带有一些语法糖的复合术语。您可以使用以下查询来揭示规范语法:
| ?- write_canonical([]).
[]
yes
| ?- write_canonical([1,2,3]).
'.'(1,'.'(2,'.'(3,[])))
yes
如果将查询结果与列表数据结构的抽象定义进行比较,可以看到空列表由原子[]
表示,非空列表是'.'/2
复合术语,其中第一个参数是列表元素,第二个元素是列表。
您可以通过定义合适的复合词来定义自己的 "data structures"。一个好的起点是一个简单的二叉树。您将需要空树的表示,例如原子 nil
,以及一个包含三个节点参数的复合术语:节点元素、左树和右树。例如:tree(a, tree(c,nil,nil), tree(f,nil,tree(z,nil,nil)))
。从这个例子中,你能写出谓词吗?遍历树并在节点元素上调用一些谓词?例如。将它们写入标准输出?