如何检查数据类型的名称是否相同

时间:2018-02-27 14:39:21

标签: prolog

我想知道是否有一种快速检查2种数据类型是否相同的方法。

示例 - 假设我有一个这样的列表:

  

[odd(1),odd(3),even(2),odd(5),even(4)]

现在,如果我从列表中拉出2个元素(索引0和索引1),我想知道它们是相同的数据类型还是不同(即奇数())。

1 个答案:

答案 0 :(得分:0)

如果从列表中提取XY,您可以按字面意思进行检查,

X = odd(_), Y = odd(_) ; X = even(_), Y = even(_).

或者更一般地说,你可以检查......

functor(X, Functor, ArgCount),
functor(Y, Functor, ArgCount).

如果XY具有相同的仿函数(例如evenodd)以及它们是否具有相同数量的参数,则上述操作会成功。 functor/3是ISO Prolog谓词,因此它适用于任何符合ISO标准的Prolog。

您可以在Prolog提示中进行一些测试。请注意,只有成功的结果是所选列表成员的“数据类型”匹配时。

| ?- List = [odd(1), odd(3), even(2), odd(5), even(4)], member(X, List), member(Y, List), functor(X, F, A), functor(Y, F, A).

A = 1
F = odd
List = [odd(1),odd(3),even(2),odd(5),even(4)]
X = odd(1)
Y = odd(1) ? ;

A = 1
F = odd
List = [odd(1),odd(3),even(2),odd(5),even(4)]
X = odd(1)
Y = odd(3) ? ;

A = 1
F = odd
List = [odd(1),odd(3),even(2),odd(5),even(4)]
X = odd(1)
Y = odd(5) ? ;

A = 1
F = odd
List = [odd(1),odd(3),even(2),odd(5),even(4)]
X = odd(3)
Y = odd(1) ? ;

A = 1
F = odd
List = [odd(1),odd(3),even(2),odd(5),even(4)]
X = odd(3)
Y = odd(3) ? a

A = 1
F = odd
List = [odd(1),odd(3),even(2),odd(5),even(4)]
X = odd(3)
Y = odd(5)

A = 1
F = even
List = [odd(1),odd(3),even(2),odd(5),even(4)]
X = even(2)
Y = even(2)

A = 1
F = even
List = [odd(1),odd(3),even(2),odd(5),even(4)]
X = even(2)
Y = even(4)

A = 1
F = odd
List = [odd(1),odd(3),even(2),odd(5),even(4)]
X = odd(5)
Y = odd(1)

A = 1
F = odd
List = [odd(1),odd(3),even(2),odd(5),even(4)]
X = odd(5)
Y = odd(3)

A = 1
F = odd
List = [odd(1),odd(3),even(2),odd(5),even(4)]
X = odd(5)
Y = odd(5)

A = 1
F = even
List = [odd(1),odd(3),even(2),odd(5),even(4)]
X = even(4)
Y = even(2)

A = 1
F = even
List = [odd(1),odd(3),even(2),odd(5),even(4)]
X = even(4)
Y = even(4)

yes
| ?-