0

我在理解以下序言谓词时遇到了一些麻烦,我可以理解它连接了一些字符,也产生了可能的列表(第一个和第二个目标),但我不明白它是如何做到的?它是如何执行的?

domains 

i=integer
l=i*
slist=string*
clist=char*

predicates 

nondeterm conc(clist,clist,clist). 

clauses 

conc([],L,L). 
conc([H|L1],L2,[H|L3]):- 
conc(L1,L2,L3).

第一个目标

goal 

conc(['a','b'],['c','d'],L).

result 

L=['a','b','c','d']

第二个目标

goal

conc(L1,L2,['a','b','c']).

result 

L1=[], L2=['a','b','c']
L1=['a'], L2=['b','c']
L1=['a','b'], L2=['c']
L1=['a','b','c'], L2=[]
4 Solutions
4

1 回答 1

3

我既不是序言专家,也不是逻辑专家,但我会尝试解释我认为它是如何工作的。

调用后:

<- conc(['a','b'],['c','d'],L).

Prolog 将寻找与签名匹配的谓词。在这种情况下,这将是:

conc([H|L1],L2,[H|L3])

它试图用给定的数据解析变量。

 |1: H:=['a'], L1:=['b'], L2:=['c','d']

现在它通过这些数据调用进入递归:

<- conc(['b'], ['c','d'], L3).
 |2: H:=['b'], L1:=[], L2:=['c','d']
<- conc([], ['c','d'], L3).

最后一行导致 prolog 使用带有签名的谓词:

conc([],L,L).

解决:

 |3: L:=['c','d']

现在 Prolog 能够构建将 L 移交给递归堆栈的连接列表。

 |2: [H|L3]:=['b','c','d']
 |1: [H|L3]:=['a','b','c','d']

我希望这是朝着正确方向的暗示。也许您应该阅读这篇文章以进行澄清

于 2012-04-18T11:24:06.263 回答