Prolog 中的关联列表

Associative list in Prolog

我正在prolog中做关联表 我看到了这个主题,但我不明白代码。

检查列表是关联的还不够这样做:

 lists([_X, _Y]).
 lists([[H|_T]|L],[H|T]):- lists(L,T).

因为首先 /1 我用这种方式检查是否有元素 [a,3] 和 /2 以这种方式获取列表 [[a,4],[a,3]] 的列表。 所以首先在 [a,3] 上通过调用 list/2,并检查基本情况是否为真,然后在调用 [a,4] 之后也为基本情况调用 true。

我错了,但我没看到,

谁能帮我解释一下?


OP 2019-01-01更新10:40:47Z:

我尝试这样解决:

islist([_X,_Y]).
islist([_X|T]):- islist(T).

在这种情况下只接受以这种方式输入

[[k,v],[k,v],[k,v]]

但像这样接受所有输入:

所以我的问题仍然存在。

来自链接的问题:

"[] is the list ; [also, if] k is a key, v is a value and a is an associative list, then [[k, v] | a] is an associative list."

只需在 Prolog 中写下:

associative_list(L) :- L = [].
associative_list(L) :- K=K, V=V, associative_list(A), L = [[K, V] | A].

当然,作为一种编程语言的 Prolog 有操作问题以及它的逻辑语义,所以最后一行最好写成

associative_list(L) :- L = [[_K, _V] | A], associative_list(A).

一种惯用的写法是

associative_list([]).
associative_list([[_, _] | A]) :- associative_list(A).