在prolog中转换为点表示法

Pri*_*ess 9 syntax list prolog

我必须[[fruits],[ ] ]在Prolog中以点符号形式表示,下面是我是如何做到的,但有些东西告诉我这是错误的,因为我也扩展[[ ]]了,这是不正确的?

.([fruits],[[ ]] )

.(.(fruits, []),.([],[])
Run Code Online (Sandbox Code Playgroud)

mat*_*mat 7

除了Willem所写的内容之外,您始终可以使用它write_canonical/1来获取 任何术语的规范表示.

例如,在您的情况下:

| ?- write_canonical([[fruits],[ ] ]).
'.'('.'(fruits,[]),'.'([],[]))

这解决了任务,并显示您已[[]]正确扩展列表.

特别是,我们有:

| ?- write_canonical([[]]).
'.'([],[])

这是正确的:这是一个包含单个元素的列表,  []如该'.'/2 术语的第一个参数所示.因为它是唯一的元素,所以第二个参数也是  [].

  • 谢谢你们,这非常有帮助 (3认同)

Wil*_*sem 5

嗯,这./2就是Lisp所谓的cons.它包含两个参数:头部元素和尾部.尾部可以是空列表[],也可以是其他列表cons.

我们先来看看我们要转换的术语:

X = [ [fruits] , [] ]
Run Code Online (Sandbox Code Playgroud)

我们看到的是一个包含两个元素的外部列表(我们现在将忽略这些元素).这意味着我们有一个像这样的结构:

X = .( Item1, .( Item2, []) ).
Run Code Online (Sandbox Code Playgroud)

现在我们当然还需要填写Item1Item2.Item2并不难:它是空列表[]所以:

Item2 = [].
Run Code Online (Sandbox Code Playgroud)

Item1 另一方面是一个包含一个元素的列表,因此结构是:

Item1 = .( Item11, [] ).
Run Code Online (Sandbox Code Playgroud)

使用Item11该子列表的项目.该项目是fruits,这意味着:

Item11 = fruits.
Run Code Online (Sandbox Code Playgroud)

如果我们把这些放在一起,我们得到:

X = .( .(fruits,[]), .([],[]) ).
Run Code Online (Sandbox Code Playgroud)

如果我们在GNU-Prolog(gprolog)中输入它,我们得到:

$ gprolog
GNU Prolog 1.4.5 (64 bits)
Compiled Feb  5 2017, 10:30:08 with gcc
By Daniel Diaz
Copyright (C) 1999-2016 Daniel Diaz
| ?- X = .( .(fruits,[]), .([],[]) ).

X = [[fruits],[]]

yes
Run Code Online (Sandbox Code Playgroud)

gprolog 因此它可以是一个进行验证的工具,因为它会将点符号转换为列表的语法糖.

  • 如果你有一个预期的答案,你可以随时检查相等/统一:```.(.(fruits,[]),.([],[])).= [[fruits],[]]```. (3认同)