繁体   English   中英

Prolog-在列表中选择较大的值

[英]Prolog - Select the greater value in a list

我是prolog的新手,我的问题很简单,我只想从prolog的列表中获取一个元素,这些元素就像:

[[List],Cost]

例如:

Set = [ [[point1,point2,point3,point4],33],[[point1,point3,point2,point4],31],[[point2,point1,point3,point4],46] ]

在上一个示例中,我只想选择更大的一个:

[point2,point1,point3,point4],46]

谢谢你的帮助。

刚刚结束,如果我想获得所有昂贵的清单(一张一张)怎么办? 例如:

设置= [[L1,33],[L2,31],[L3,26],[L4,31]]

cheap_paths(Set,Path)。

L2; L4;

没有

问候,

拉尔斯。

以下子句将遍历列表,并返回具有最高值的元素(和值)。

% find_max(INPUT_LIST, OUTPUT_ELEMENT, OUTPUT_VALUE).

% Clause 1 - Only one element in the list - must be the max one
find_max([[R, Value]], R, Value).

% Clause 2 - The head element has a greater value than the remaining elements
find_max([[R, Value] | Others], R, Value) :-
    find_max(Others, _, LowerValue),
    LowerValue < Value, !.

% Clause 3 - The head element has a lower (or equal) value than the remaining elements
find_max([_ | Others], R, Value) :-
    find_max(Others, R, Value).

使用示例:

2 ?- find_max([ [[point1,point2,point3,point4],33],[[point1,point3,point2,point4],31],[[point2,point1,point3,point4],46] ], Element, Value).
Element = [point2, point1, point3, point4],
Value = 46 .

3 ?- 

只需遵循您的数据类型-列表的-定义,并按互斥情况区分大小写:

find_max([H|T], X):- find_max(T,H,X).

仅非空列表具有最大元素;

find_max([H|T], Y, X):- Y >= H -> find_max(T,Y,X) ; find_max(T,H,X).

如果到目前为止的最大值仍然是最大的,则继续遍历列表; 否则使用新遇到的最大值;

find_max([], X, X).

当列表用尽时,请注意最大范围-我们现在知道是搜索到的最大元素。

请注意,当我们遍历列表时,我们将如何传递更新的当前信息,同时我们将传递的结果变量( X )保持不变,以便与最终知道的结果统一。

那就是用简单的>=比较元素; 您应该为输入列表的特殊数据元素做出特殊的比较谓词:

is_greater_than( [_,C1], [_,C2]):- C1 >= C2.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM