后缀/前缀在prolog内部如何工作?

时间:2018-09-29 13:52:27

标签: prolog

谁能解释一下序言如何在内部找到 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

1 个答案:

答案 0 :(得分:2)

如果您understand append,则定义

suffix( A, B) :- append( _X, B, A).   

是……实际上,append( X, B, A)的含义是什么?

(在 pseudocode 中)[...X, ...B] == AX的元素列表,后跟B的元素,一起是元素列表在A中。

这意味着BA的(后缀/前缀-请选择),对吗?而且我们不在乎X是什么。特别是它可以为空,也可以为空。

这说明了suffix。对于append,请参阅链接的答案和answer it links

这为我们提供了后续问题的思路:

  • 定义谓词proper_suffix(A, B),以使“ A的proper_suffix为B”成立,即BA的后缀,并且B与{ {1}}。

您写

  

我不了解后缀参数的A_中的含义。 append([H|T], Y, [H|W]):- append(T,Y, W)如何处理append_的{​​{1}},以找出H是否是append的后缀?如果我通过L2,那么Prolog如何通过匿名变量找出L1_,因为我们是说'我们不在乎它的值'

所以我们有

H

无论Tsuffix( A, B) :- append( _X, B, A). 在对A的调用中如何,它们在对B的调用中都是相同的。当该调用返回逻辑变量suffix(A, B)append( _X, B, A)_X并保持其值(可能已更新)时,对A的调用返回 Bsuffix拥有与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 = []. 现在拥有的列表是通过自上而下的方式构建的。