我正在尝试在Prolog中进行简单的树搜索,并且我需要一个函数,该函数将返回给定节点的子代列表。
我的代码是:
#!/bin/ksh
if [ $# -ne 1 ]; then
echo Param: [ENV]
exit 1
fi
ENV=$1
if [ $ENV == "qa" ]
then
HDFS_LOCATION="QA" && HIVE_DB="qa"
else
HDFS_LOCATION="prod" && HIVE_DB="prod"
fi
if [ $ENV == "prod" ]
then
ISILON="isilonprod"
else
ISILON="isilondev"
fi
check() {
if [$1 -ne 0]; then
echo "----------------------Error-------------------"
exit 1
else
echo "----------------------------------------------"
echo "----------------------Done--------------------"
echo "----------------------------------------------"
fi
}
echo "#################### CREATE TABLES IN HIVE ##################################"
hconnect -f --hivevar hdfs_location=${HDFS_LOCATION} --hivevar isilon=${ISILON} /tmp/nanda/deployment/poc_src_dallas_al.hql
check $?
echo "#################### END HIVE ONLY TABLES ##################################"
ERROR:
[root@myhost deployment]# sh deploy.ksh qa
'eploy.ksh: line 22: syntax error near unexpected token `{
'eploy.ksh: line 22: `check() {
当前,我遇到错误未定义的过程:children / 1,这很有意义,因为我尚未实现带有1个参数的函数。 我该如何实现这样的功能?
答案 0 :(得分:3)
由于您对列表感兴趣,为什么不考虑在任务中使用DCG?毕竟,DCG描述了列表,并且它们产生易于阅读的代码。方便地,给定的事实node / 2提供了列表中节点的直接后继对象,因此,将要访问的节点列表用作DCG的单个参数是适当的。 DCG本身可以根据其描述来命名,例如children // 1。您可以定义一个调用谓词,让我们给它一个漂亮的描述性名称,例如node_children / 2,它使用词组/ 2来调用DCG:
node_children(N,C) :-
node(N,Succs), % Succs are the direct successors of node N
phrase(children(Succs),C). % based on them the DCG children//1 describes the list C
DGC子节点// 1必须描述一个列表,该列表由其参数列表中的所有节点以及它们各自的子节点组成,即它们各自的后继者,其后继者的后继者,等等(该措辞已经带有递归的气味:-)。所以children // 1可能看起来像这样:
children([]) --> % if there are no nodes
[]. % there are no children
children([N|Ns]) --> % N, the first node in the list...
{node(N,Succs)}, % ...has the direct successors Succs...
[N], % ...and is in the list of children...
children(Succs), % ...as well as its successors and their children...
children(Ns). % ...as well as the other nodes in the list
在child // 1递归规则的第一个目标{node(N,Succs)}
中,您可以观察如何在DCG中调用谓词,即用大括号将其谓词。现在让我们来看一下node_children / 2的作用:
?- node_children(a,C).
C = [b,c,d,e,f]
?- node_children(b,C).
C = []
?- node_children(c,C).
C = [d,e,f]
您还可以问一些更通用的查询,例如其中有哪些节点和各自的子节点?:
?- node_children(N,C).
C = [b,c,d,e,f],
N = a ? ;
C = [],
N = b ? ;
C = [d,e,f],
N = c ? ;
C = [],
N = d ? ;
C = [],
N = e ? ;
C = [],
N = f
还是哪个节点有三个孩子?:
?- C=[_,_,_], node_children(N,C).
C = [d,e,f],
N = c ? ;
no
两个结束语:您可以通过查询?- listing(children).
来了解DCG children // 1如何转换为谓词。要了解有关DCG的更多信息,我可以全力推荐this DCG Primer。