2010-11-09 99 views
1

我对由大量连词组成的公式感兴趣(更大的问题的一部分)。我想写一个程序,它是这样的:搜索Prolog结构

:- get_params(conj(conj(a,b),c),X)

,并返回连词即X=[a,b,c]的所有参数的列表。目前,我可以做

:- get_params(conj(a,b),X)使用简单的Prolog的模式匹配来获取X=[a,b]

但你会如何去这样做的东西,如

:- get_params(conj(conj(a,b),c),X)得到X=[a,b,c]

这似乎很简单,但我一整天都在苦苦挣扎!

回答

2

假设所有连词仿函数是二进制的:

get_params(X, Y, L) :- 
    get_params(X, L1), 
    get_params(Y, L2), 
    append(L1, L2, L). 
get_params(conj(X, Y), L) :- 
    get_params(X, Y, L), !. 
get_params(A, [A]). 
+0

你不知道我是如此复杂,这很简单。谢谢 :)。 – ale 2010-11-09 17:00:54

+0

不客气。不要让Prolog的巫术感觉把你扔到你的轨道上。通常很简单。例如,函子只是标记的数据结构,如你所见。 – 2010-11-09 17:09:04

4

因为你所描述的列表,可以考虑使用DCG符号:

params(conj(A,B)) --> !, params(A), params(B). 
params(X)   --> [X]. 

例子:

?- phrase(params(conj(conj(a,b),c)), Ps). 
Ps = [a, b, c].