Prolog,在列表中查找与参考值差异最小的值

Prolog, find value with smallest difference to reference value in a list

我需要你对 Prolog 的帮助,希望我的解释不会太难。

一般问题是:我有一个包含多个特征结构的列表(实际上是 Prolog 中的 feature:value 列表),其中一个值为 "time:xyz"。我有一个带有参考时间的参考特征结构。现在我需要时间值最接近我的参考时间的特征结构。

我的计划是遍历列表并将当前最小差异的每个条目与参考时间进行比较。 问题是变量 MinFSR 是当前最小值,在第一次调用 minimum(...) 时没有值。所以我得到一个错误。 如何检查 MinFSR 是否已经有一个值?我想检查一下,如果它没有值,那么我想用 H 作为新 MinFSR.

调用 list_min
list_min([], ReferenceFSR, MinFSR). %if list is empty stop
list_min([H|T], ReferenceFSR, MinFSR) :-
   minimum(H, MinFSR, ReferenceFSR, Min1),
   list_min(T, ReferenceFSR, Min1).


minimum(FSR1, FSR2, ReferenceFSR, MinFSR):-
   % reads out and compares the time of FSR1 and FSR2 to the referenceFSR 
   % and MinFSR is the FSR1 or FSR2 depending on which has the smaller
   % difference

虽然我写的很复杂,但希望你能理解我的问题。 提前致谢!

我认为你很接近,但你的谓词需要稍微修改一下。递归情况应该查看列表的两个头元素,因为您已经给出了一个谓词 minimum/4,它通过比较一对值产生所需的选择。

list_min([X], _, X).       % X is min for single list, [X]
list_min([X,Y|T], ReferenceFSR, MinFSR) :-
    minimum(X, Y, ReferenceFSR, Min),
    list_min([Min|T], ReferenceFSR, MinFSR).