谁能解释一下序言如何在内部找到 node {
stage('Build') {
S3Bucket='"my-bucket"'
S3Key='"test.zip"'
print 'sh aws elasticbeanstalk create-application-version --application-name Name --version-label v2 --source-bundle S3Bucket='+S3Bucket+',S3Key='+S3Key
}
}
或suffix(L1,L2)
?
我知道规则是prefix(L1,L2)
但是,我似乎无法理解suffix(L1,L2):- append(_,L2,L1).
,_
和L1
这些变量如何追加并执行查询?
L2
答案 0 :(得分:2)
如果您understand append
,则定义
suffix( A, B) :- append( _X, B, A).
是……实际上,append( X, B, A)
的含义是什么?
(在 pseudocode 中)[...X, ...B] == A
:X
的元素列表,后跟B
的元素,一起是元素列表在A
中。
这意味着B
是A
的(后缀/前缀-请选择),对吗?而且我们不在乎X
是什么。特别是它可以为空,也可以为空。
这说明了suffix
。对于append
,请参阅链接的答案和answer it links。
这为我们提供了后续问题的思路:
proper_suffix(A, B)
,以使“ A的proper_suffix为B”成立,即B
是A
的后缀,并且B
与{ {1}}。您写
我不了解后缀参数的
A
在_
中的含义。append([H|T], Y, [H|W]):- append(T,Y, W)
如何处理append
中_
的{{1}},以找出H
是否是append
的后缀?如果我通过L2
,那么Prolog如何通过匿名变量找出L1
和_
,因为我们是说'我们不在乎它的值'。
所以我们有
H
无论T
和suffix( A, B) :-
append( _X, B,
A).
在对A
的调用中如何,它们在对B
的调用中都是相同的。当该调用返回逻辑变量suffix(A, B)
,append( _X, B, A)
和_X
并保持其值(可能已更新)时,对A
的调用返回其 B
和suffix
拥有与A
调用中相同的值。 B
谓词未使用append
的值,但是_X
发现它的 相同。
您似乎对匿名变量suffix/2
感到困惑。这样命名就没关系,它仍然是变量。忘记“无关”的事情,这是令人困惑和不精确的。想象一下,正如我所展示的,它被命名为append/3
。只要与其他变量的名称不同,它将与_
,_X
,_Y
等完全相同。那条规则。
一个警告:没有前导_
的Prolog会警告我们“单变量”,即在其他任何地方都没有使用过的变量。就 this 而言,我们用(开头)Abracadabra
表示“我们不在乎”的意图。
仍然像往常一样找到它的价值!
当我们使用_
时,额外的便利是我们不必确保名称唯一。每个_
会自动被视为唯一。
您问(在评论中)查询_
是如何工作的。
Prolog通过选择其头部匹配查询的规则来工作。
此查询与第二个子句的标题匹配:
_
与
append(_X, [a,b], [1,2,a,b])
这也意味着
append(_X, [a,b], [1,2,a,b]) = append([H|T], Y, [H|W])
因此
_X = [H|T], Y = [a,b], [H|W] = [1,2,a,b]
看到了吗?这不会解构 H = 1, W = [2,a,b],
,它会建立它!
由于其头部与查询匹配,因此您选择了_X = [H|T] = [1|T]
定义的 second 子句,因此将其正文作为替代下的> new 查询,即对所涉及的逻辑变量的“分配”集。所以它叫
_X
作为新查询。也就是说,
append
如果我们采用相同的推理,我们将再次看到第二个子句匹配,并以
结尾_X = [H|T], Y = [a,b], [H|W] = [1,2,a,b], append(T,Y,W).
但是现在 first 子句匹配了,
_X = [1|T], Y = [a,b], W = [2,a,b], append(T,Y,W). %% or,
_X = [1|T1], append(T1, [a,b], [2,a,b]).
需要
_X = [1|T1], T1 = [2|T2], append(T2, [a,b], [a,b]).
因此
append(T2, [a,b], [a,b]) = append([],X,X)
T2 = [].
现在拥有的列表是通过自上而下的方式构建的。