2012-04-17 83 views
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 

回答

2

我既不在序言的专家,也没有逻辑,但我会尽力解释我的想法怎么运行的。

调用后:

<- 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). 

最后一行导致序言使用谓词与签名:

conc([],L,L). 

解析:

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

Now Prol og能够构建将递归栈交给L的concatinated List。

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

我希望这是一个正确的方向提示。也许你应该读this article澄清