gpt4 book ai didi

scheme - 方案中的点符号

转载 作者:行者123 更新时间:2023-12-02 09:59:41 25 4
gpt4 key购买 nike

我是计划编程的初学者。我知道Scheme中的点符号用于表示一对符号,例如'(a . b)

第一个元素可以是一个符号,也可以是一个列表,这并不重要。但特别是第二个元素必须是一个符号,如果不是,例如可能是一个列表,那么我们就无法使用内置的 cons 过程创建一对。

那么是否可以创建一对 2 个列表???好吧,我正在考虑一个解决方案是将列表转换为符号,但实际上这是两个完全不同的事情 ->据我所知是不可能的。

这是我写的代码:

(define compare-attrs
(lambda (attribute1 attribute2)
(if (or (and (null? attribute1) (null? attribute2)) (and (not (null? attribute1)) (not (null? attribute2))))
(cons attribute1 attribute2)
#f)))

其中attribute1和attribute2是2个列表,我的输出是:

attribute1 atrribute2

预期输出:'(attribute1 . attribute2)

请解释一下。提前致谢!!!

编辑:添加比较属性函数的使用

函数compare-attrs用于提取描述实体属性的部分,并cons它们以形成一对,实体定义如下:

(entity e0 (prov:label "entity e0")
(entity e1 (prov:location "London")

这些实体的属性是(prov:label "entity e0")(prov:location "London")。当应用函数compare-attrs时,因为这些属性不为null,所以我期望的输出是

`(prov:label "entity e0") . (prov:location "London")`

最佳答案

注意:这是从 Recursive range in Lisp adds a period? 的答案中截取的,这实际上是在问一个不同的问题。然而,如何打印对的解释是相同的。其余答案不同。

您的问题存在一些误解,但我认为我们可以澄清。

The first [argument to cons] could be a symbol, or a list, it doesn't matter. But specially the second element must be a symbol, if it is not, may be a list for instance, then we can't create a pair with built-in cons procedure.

这是不正确的。您可以调用cons无论你喜欢什么论点,你总是会得到 conscar 的单元格与 cons 的第一个参数相同,以及谁的cdrcons 的第二个参数相同。也就是说,关于 cons 唯一重要的事情是它满足方程

(eq? a (car (cons a b))
(eq? b (cdr (cons a b))

So is it possible to create a pair of 2 lists??? Well i'm thinking of a solution is that converting a list to symbol but actually those are 2 completely different thing -> impossible as i understand.

这很有可能;如果您有两个列表,例如 list1list2 ,您可以创建一对 carlist1以及谁的cdrlist2只需调用 (cons list1 list2) 。现在,我认为您遇到的问题是您期望看到 (<value-of-list1> . <value-of-list2>)作为输出,你会看到一些不同的东西。为了解释为什么会这样,我们需要了解列表在 Lisp 中是如何表示的,以及如何打印对的。

Scheme 中的列表可以是空列表 () (在某些 Lisp 中也称为 nil),或者一个 cons 单元,其 car (也称为 first )是列表的一个元素,其 cdr (也称为 rest )是列表的其余部分(即另一个列表),或者是终止列表的原子。常规终止符是空列表 () ;列表终止于 ()被称为“正确的列表”。由任何其他原子终止的列表称为“不正确列表”。列表(1 2 3 4 5)包含元素 1、2、3、4 和 5,并以 () 终止。你可以通过

构建它
(cons 1 (cons 2 (cons 3 (cons 4 (cons 5 ())))))

现在,当系统打印一个cons单元时,一般情况是通过

打印它
(car . cdr)

例如(cons 1 2)的结果打印为

(1 . 2)

由于列表是由 cons 单元格构建的,因此您也可以对列表使用此表示法:

'(1 2 3 4 5) ==
'(1 . (2 . (3 . (4 . (5 . ())))))

不过,这相当笨重,所以大多数 lisp(据我所知)都有打印 cons 单元格的特殊情况:如果 cdr是一个列表(另一个 cons 单元格或 () ),那么不要打印 . ,并且不打印 cdr 周围的括号(否则它会有,因为它是一个列表)。

现在我们可以解释为什么结果是 (cons list1 list2)看起来不像(<value-of-list1> . <value-of-list2>) 。如果您调用cons有两个列表,您确实会得到一对预期的 carcdr ,但它没有打印 .符号。例如,

(cons '(1 2 3) '(a b c))
;=> ((1 2 3) . (a b c)) ; which is typically *printed* as
;=> ((1 2 3) a b c)

但是,只要以下方程成立,打印的表示形式并不重要:

(eq? a (car (cons a b))
(eq? b (cdr (cons a b))

果然:

(car (cons '(1 2 3) '(a b c)))
;=> (1 2 3)

(cdr (cons '(1 2 3) '(a b c)))
;=> (a b c)

在您询问的具体示例中,请考虑调用时会发生什么

(cons '(prov:label "entity e0") '(prov:location "London"))

事实上,结果是

((prov:label "entity e0") . (prov:location "London"))

但是,由于打印规则,这打印

((prov:label "entity e0") prov:location "London")

尽管如此,您仍然可以使用 car 来获取这两个属性。和cdr :

(car '((prov:label "entity e0") prov:location "London"))
;=> (prov:label "entity e0")

(cdr '((prov:label "entity e0") prov:location "London"))
;=> (prov:location "London")

这就是您稍后真正需要做的事情。

关于scheme - 方案中的点符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20216711/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com