下面有一个简单的函数,它有两个列表(大小相同)和一个存储一些结果的变量。
我的目的是将第一个列表的头部与第二个列表的头部进行比较,并将结果增加一个,然后将其返回。
但我获得true
/ false
。
myfunction( [], [], 0).
myfunction([H1|T1], [H2|T2], N) :-
H1 > H2 -> myfunction(T1, T2, N1 + 1); myfunction(T1, T2, N1), N is N1 .
答案 0 :(得分:2)
你将Prolog视为命令式/程序性语言,但它不会那样工作。您应该阅读一些Prolog教程和/或书籍。
在Prolog中,您定义了一个定义关系的谓词。当您使用变量定义谓词时,您会说,这些变量以这样的方式相关,如果...... 。如果Prolog成功验证关系是否为真,则谓词响应为" true"或"是"。否则,它会响应" false"或"不"。
这是对您尝试做的事情的修改:
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
的上述定义假设您希望在列表长度不同时失败。如果您不想在这些情况下失败,则需要重新定义基本案例。