Prolog 避免谓词中的递归

Prolog 避免谓词中的递归,prolog,Prolog,对于下面的谓词,我有一个问题,如何从两个谓词中删除递归调用f(T,S1) 流量模型: (i,o) 这是一个技巧性的问题,我对prolog不太在行。第二个谓词总是失败。=>可以删除,但是第二个谓词呢。正如我看到的,这个方法是一个列表元素计数器。谢谢 这有可能吗?下面的情况如何?它很有效率 f([],0)。 f([H | T],S):- f(T,S1), (S1>2 ->S是S1+H ;S是S1+1 ). 好的,这是一个复杂的问题。你以为这是个骗人的问题,但真的是这样吗?我们怎么能确定?我会让lib

对于下面的谓词,我有一个问题,如何从两个谓词中删除递归调用
f(T,S1)

流量模型: (i,o)

这是一个技巧性的问题,我对prolog不太在行。第二个谓词总是失败。=>可以删除,但是第二个谓词呢。正如我看到的,这个方法是一个列表元素计数器。谢谢


这有可能吗?

下面的情况如何?它很有效率

f([],0)。 f([H | T],S):- f(T,S1), (S1>2 ->S是S1+H ;S是S1+1 ).
好的,这是一个复杂的问题。你以为这是个骗人的问题,但真的是这样吗?我们怎么能确定?我会让
library(clpfd)
帮我思考。首先,我将重写您的程序:

:- use_module(library(clpfd)).

fx([],0).
fx([H|T],S):-
    fx(T,S1),
    S1 #> 2,
    S #= S1 + H.
fx([_|T],S):-
    fx(T,S1),
    S1 #=< 2,
    S #= S1 + 1.
因此,请查看
N=0
N=3
的答案:没有约束,实际上忽略了列表中的所有元素。但是,从
N=4开始,第一个元素
\u A
现在影响“和”
S
,因为等式
S
成立!随着价值的增加,事情变得越来越复杂


无论如何,我看不出这怎么会是一个骗人的问题。最后三个元素被忽略。嗯,这是一种诡计。但其他因素(或至少其中的一些因素)会影响结果

为什么这应该是一个技巧性的问题?因为
S是S1+H
从未出现过?对于长度超过三个的列表,这是相关的!为什么要放弃递归调用?递归是在Prolog中执行列表处理的方式。这是一个练习,我看到过,我很好奇,我可能错过了什么,如果可能的话,是的,但是正如你所做的,它仍然需要递归调用,所以必须有一些rec调用(这也是我教的),但是我的函数测试是如何进行的:
13?-f([1,2,3,4,5,6,7,8,9,10,11,12,14,151000,17,18],R=17。
返回我从你的程序
f/2
和我的版本
fx/2
得到的列表元素数,而不是
R=110。
我们一定遗漏了什么! f([],0). f([H|T],S):- f(T,S1), ( S1 > 2 -> S is S1 + H ; S is S1 + 1 ).
:- use_module(library(clpfd)).

fx([],0).
fx([H|T],S):-
    fx(T,S1),
    S1 #> 2,
    S #= S1 + H.
fx([_|T],S):-
    fx(T,S1),
    S1 #=< 2,
    S #= S1 + 1.
| ?- assert(clpfd:full_answer).
yes
| ?- length(L,N), fx(L,S).
   L = [],
   N = 0,
   S = 0 ?
;
   L = [_A],
   N = 1,
   S = 1 ?
;
   L = [_A,_B],
   N = 2,
   S = 2 ?
;
   L = [_A,_B,_C],
   N = 3,
   S = 3 ?
;
   L = [_A,_B,_C,_D],
   N = 4,
   _A+3#=S,
   _A in inf..sup,
   S in inf..sup ?
;
   L = [_A,_B,_C,_D,_E],
   N = 5, ...