我对由许多连词组成的公式(更大问题的一部分)感兴趣。我想写一个这样的程序:
:- get_params(conj(conj(a,b),c),X)
并返回连词的所有参数的列表,即X=[a,b,c]
. 目前我可以做
:- get_params(conj(a,b),X)
要得到X=[a,b]
使用简单的 Prolog 模式匹配,但你将如何做一些事情,例如
:- get_params(conj(conj(a,b),c),X)
要得到X=[a,b,c]
看起来很简单,但我整天都在挣扎!
由于您正在描述一个列表,请考虑使用 DCG 表示法:
params(conj(A,B)) --> !, params(A), params(B).
params(X) --> [X].
例子:
?- phrase(params(conj(conj(a,b),c)), Ps).
Ps = [a, b, c].
假设所有 conj 函子都是二进制的:
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]).