我在理解下面的prolog谓词时遇到了一些麻烦, 我可以理解它连接了一些字符,也产生了可能的列表(第一和第二个目标),但我无法理解它是如何做到的?它是如何执行的?
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
答案 0 :(得分: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能够构建连续的List,将L递归递归栈。
|2: [H|L3]:=['b','c','d']
|1: [H|L3]:=['a','b','c','d']
我希望这是正确方向的暗示。也许您应该阅读this article以获得澄清