prolog - 在序言中返回真值而不是整数值

标签 prolog

下面我有一个简单的函数,它需要两个列表(具有相同的大小)和一个存储一些结果的变量。

我的目的是将第一个列表的头部与第二个列表的头部进行比较,并将结果加一,然后返回。

但我得到的是 true/false

myfunction( [], [], 0).
myfunction([H1|T1], [H2|T2], N) :- 
        H1 > H2 -> myfunction(T1, T2, N1 + 1); myfunction(T1, T2, N1), N is N1 .

最佳答案

您将 Prolog 视为命令式/过程式语言,但它并不是这样工作的。您应该通读一些 Prolog 教程和/或书籍。

在 Prolog 中,您定义一个定义关系的谓词。当您定义带有变量的谓词时,您是在说,这些变量以这样那样的方式相关,如果...。如果 Prolog 成功验证关系为真,则谓词响应“true”或“yes”。否则,它会响应“false”或“no”。

以下是您尝试执行的操作的返工:

my_predicate([], [], 0).

此关系是“基本情况”,表示当列表为空时,第一个列表中的相应值大于第二个列表中的相应值的情况计数为 0。

my_predicate([H1|T1], [H2|T2], N) :-
    my_predicate(T1, T2, N1),
    (  H1 > H2
    -> N is N1 + 1
    ;  N = N1
    ).

此关系表示,N 是第一个列表中的相应值大于第二个列表的情况的计数如果N1 是尾部的情况计数,并且 N 是如果当前水头更大,则 N1 + 1,否则 N 为 N1

如果你想让它尾递归以提高效率,你可以使用累加器:

my_predicate(L1, L2, N) :-
    my_predicate(L1, L2, 0, N).

my_predicate([], [], N, N).
my_predicate([H1|T1], [H2|T2], A, N) :-
    (  H1 > H2
    -> A1 is A + 1
    ;  A1 = A
    ),
    my_predicate(T1, T2, A1, N).

请注意,上面的 my_predicate/3 定义假设如果列表长度不同,您希望失败。如果您不希望在这些情况下失败,则需要重新定义基本情况。

关于prolog - 在序言中返回真值而不是整数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24107673/

相关文章:

prolog - 如何为这样的抽象语法树构建解释器?

prolog - 向 DCG 添加解析约束

succ/2 的 Prolog 定义

prolog - 序言中的深度优先,找到目标但无法跟踪路径

macos - Prolog错误的编译?

Prolog 取一个列表的一部分

prolog - SWI Prolog 多个知识库

prolog - 列表的最后一个成员是一个内存位置

prolog - 如果存在剪切 '!',执行有何不同?

c++ - 从 C/C++ 调用 Prolog 时将事实传达给 Prolog(不使用断言)