比较两个清单?

时间:2010-11-15 02:40:21

标签: prolog

我正在尝试按长度比较两个列表,并将输出设置为true或false。

min(List1, List2, output) :-
     length(List1, N),
     length(List2, M),
       output is N<M.

但是我一直在收到错误,这些列表的语法是什么?

3 个答案:

答案 0 :(得分:3)

这里有几个问题; @Enigmativity是正确的,你需要使Output变量,但is/2没有在运算符<上定义(它用于评估算术表达式,如+,或those that are user defined)。

相反,请考虑以下事项:

min(List1, List2, Output) :-
    length(List1, N),
    length(List2, M),
    (N < M ->
        Output = 'true'
    ;   Output = 'false'
    ).

此处,N < M逻辑测试,无论是成功还是失败。 如果 N < M为真,则隐含->会指示解释器将Output变量绑定到原子'true' else 'false',表示您要求的列表之间的长度关系。你可以随意绑定任何东西,而不仅仅是原子。

执行此操作会给出:

?- min([1,2,3,4],[1,2],Output).
Output = false.

如果您希望min/3只返回两个输入列表中较小的一个,您可以尝试:

min(List1, List2, Output) :-
    length(List1, N),
    length(List2, M),
    (N < M ->
        Output = List1
    ;   Output = List2
    ).

在同一个例子上执行此操作会给出:

?- min([1,2,3,4],[1,2],X).
X = [1, 2].

答案 1 :(得分:0)

这可能比解决方案运行得更快,而不是比较长度,如果有一个小的和一个非常大的列表(因为它会在达到最小列表的末尾时停止)。

min_list([_|L1t], [_|L2t], Output) :- min(L1t, L2t, Output), !.
min_list(_, [], false).
min_list([], _, true).

关于列表语法,您需要知道的是列表表示为[Head|Tail],其中Head是列表的第一个元素,Tail是包含其余元素的子列表。

! cut operator 以避免回溯以探索其他解决方案(如果您不在那里使用它,系统将等待您按分号如果您想要另一个答案,然后会说false)。

未使用的谓词变量表示为下划线(否则您将收到有关单例变量的警告)。

答案 2 :(得分:-1)

这里的简单变化是:

min(List1, List2, Output) :-
    length(List1, N),
    length(List2, M),
    Output is N<M.

Output是一个变量,而不是一个术语,所以它应该以大写字母开头。

这能解决您的问题吗?