prolog列表对

时间:2011-07-23 13:45:36

标签: list prolog

我输入了一对配对列表:

[[abs_(p,X,Y,Z),abs_(f,X,Y,Z)],[abs_(p,X,Y,Z),abs_(l,Z,P)]]

我想检查一对是否有相同数量的参数,在这种情况下是:

[abs_(p,X,Y,Z),abs_(f,X,Y,Z)]

在第二种情况下,答案是否定的。

这只是一个例子,因为更一般地说,我想知道哪一对具有相同数量的参数。输入的输出应为:

[[abs_(p,X,Y,Z),abs_(f,X,Y,Z)]

我该怎么做?

3 个答案:

答案 0 :(得分:1)

Prolog提供了一个名为“univ”的奇怪的中缀运算符 = .. ,它在复合术语和以仿函数开头的列表之间进行转换,然后是该仿函数的参数。

因此Prolog查询是这样的:

?- abs_(p,X,Y,Z) =.. L.
L = [abs_,p,X,Y,Z]
yes

所以我会在“univ”运算符生成的列表上使用 length / 2 来检查两个复合词有相同数量的参数。

答案 1 :(得分:1)

run( [], Tail) :- Tail=[].
run( [ [First,Second] | Tail ], Output ) :- First =.. List1, Second =.. List2, 
length(List1,N1), length(List2, N2), N2 is N1, !, run(Tail, Tail2), 
append( [ [First | [Second]] ], Tail2, Output ). 
run( [H|T], Output ) :- run(T, Output).

第一条规则是基本情况。第二个规则检查第一对中的参数数量是否相同,如果它运行递归调用,则将递归调用的输出附加到输出。因为切割如果N2等于N1,它不会调用第三个规则。第三条规则丢弃不匹配的对,并用列表的尾部调用自身。希望它有所帮助。

答案 2 :(得分:0)

您还可以使用模式匹配将每个对分解为术语,并使用仿函数谓词来检查这些术语的元素。