在Prolog中将对列表用作参数

在Prolog中将对列表用作参数,prolog,Prolog,我试图从关联列表中找到在Prolog中输入的每个键的值。此函数仅适用于一对。如何使其在列表中对多对工作 assoc([pair(K,V)],Key,V) :- K = Key. assoc([pair(K,[])],Key,V):- assoc([pair(K,[])],Key,V). 您的简单案例(列表中只有一对)可以写如下: assoc([pair(K,V)], K, V). 您的关联就是这样一对的列表。在Prolog中,最简单的表示方法是使用头尾形式:[H

我试图从关联列表中找到在Prolog中输入的每个键的值。此函数仅适用于一对。如何使其在列表中对多对工作

  assoc([pair(K,V)],Key,V) :-
     K = Key.
  assoc([pair(K,[])],Key,V):-
     assoc([pair(K,[])],Key,V).

您的简单案例(列表中只有一对)可以写如下:

assoc([pair(K,V)], K, V).
您的关联就是这样一对的列表。在Prolog中,最简单的表示方法是使用头尾形式:
[H | T]
其中
H
是第一个元素,
T
是尾部或列表的其余部分。在匹配的情况下,您不应该关心列表中是否还有其他元素。因此,您应该将上述内容写成:

assoc([pair(K,V)|_], K, V).
换句话说,如果第一个元素的键匹配,那么值应该匹配(反之亦然)。我不在乎关联列表的其余部分是什么样的(因此,
\uu
)。如果没有,则此子句将失败,Prolog将测试下一个子句,该子句将检查列表的其余部分:

assoc([_|AssocRest], Key, Value) :-
    assoc(AssocRest, Key, Value).
在这种情况下,我不关心第一对是什么(我已经处理好了那个案例)。所以头部是
\uu

表示键值对的更规范的方法是使用术语
键值
。因此,上述内容将成为:

assoc([K-V|_], K, V).
assoc([_|AssocRest], Key, Value) :-
    assoc(AssocRest, Key, Value).

在Prolog中,您有谓词,而不是函数(它们不是一回事)。如果需要键值对,请使用
K-V
form。SWI Prolog具有库谓词,可以自动知道如何处理它们。
assoc([pair(K,[]),Key,V):-assoc([pair(K,[]),Key,V)是什么意思?它看起来像一个即时无限递归。最后,如果您有一个键值对列表,那么它的形式应该是
[K-V|Rest]
,其中
Rest
是列表的其余部分
[pair(K,[])]
是一个只有一个元素的列表。不清楚为什么该对的值被硬编码为
[]
。@Lowerer我正在尝试在没有swipl对的情况下手动执行该操作,我需要该值,因此我尝试将该对的第二部分(值)保留为空,以便它返回该值。您可以使用称为“SWI对”的方法,但仍然手动执行该操作
K-V
只是一种表示,与SWI Prolog无关。只是某些SWI Prolog谓词能够识别它。你不必使用那些谓词。@lowerer好的,我明白你的意思了