在Prolog中获取节点的子代列表

时间:2018-11-14 09:10:50

标签: search tree prolog

我正在尝试在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个参数的函数。 我该如何实现这样的功能?

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