下面我有一个简单的函数,它需要两个列表(具有相同的大小)和一个存储一些结果的变量。
我的目的是将第一个列表的头部与第二个列表的头部进行比较,并将结果加一,然后返回。
但我得到的是 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/