【问题标题】:Prolog - Select the greater value in a listProlog - 在列表中选择较大的值
【发布时间】:2015-12-09 00:24:24
【问题描述】:

我是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] ]

expensive_paths(Set,Path).

L2; L4;

没有

问候,

拉尔斯。

【问题讨论】:

  • 亲爱的,有什么想法吗?
  • 大家好,感谢您的回答,他们对我很有帮助。
  • 然后请选择已接受的答案之一,即最有帮助的答案,因此该问题被标记为已关闭。

标签: prolog logic


【解决方案1】:

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

% 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 ?- 

【讨论】:

  • 您应该将此代码提交给 CodeReview。如果你这样做,你能不能给我打电话,这样我就可以在那里发表完整的评论。只是一个提示:如果输入中的成本排序增加,如 1,2,3,...,100?在这种情况下,调用树会是什么样子?计算复杂度是多少?
【解决方案2】:

只需按照您的数据类型 - 列表的 - 定义,逐个互斥的情况:

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) 不变,以便在最终知道结果时与结果统一。

这是将元素与简单的&gt;= 进行比较;您应该为输入列表的特殊类型数据元素制作特殊类型的比较谓词:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 2023-01-12
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    相关资源
    最近更新 更多