Pri*_*ess 9 syntax list prolog
我必须[[fruits],[ ] ]在Prolog中以点符号形式表示,下面是我是如何做到的,但有些东西告诉我这是错误的,因为我也扩展[[ ]]了,这是不正确的?
.([fruits],[[ ]] )
.(.(fruits, []),.([],[])
Run Code Online (Sandbox Code Playgroud)
除了Willem所写的内容之外,您始终可以使用它write_canonical/1来获取 任何术语的规范表示.
例如,在您的情况下:
| ?- write_canonical([[fruits],[ ] ]).
'.'('.'(fruits,[]),'.'([],[]))
这解决了任务,并显示您已[[]]正确扩展列表.
特别是,我们有:
| ?- write_canonical([[]]). '.'([],[])
这是正确的:这是一个包含单个元素的列表, []如该'.'/2 术语的第一个参数所示.因为它是唯一的元素,所以第二个参数也是 [].
嗯,这./2就是Lisp所谓的cons.它包含两个参数:头部元素和尾部.尾部可以是空列表[],也可以是其他列表cons.
我们先来看看我们要转换的术语:
X = [ [fruits] , [] ]
Run Code Online (Sandbox Code Playgroud)
我们看到的是一个包含两个元素的外部列表(我们现在将忽略这些元素).这意味着我们有一个像这样的结构:
X = .( Item1, .( Item2, []) ).
Run Code Online (Sandbox Code Playgroud)
现在我们当然还需要填写Item1和Item2.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 因此它可以是一个进行验证的工具,因为它会将点符号转换为列表的语法糖.