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, ...