【发布时间】:2022-10-15 14:22:42
【问题描述】:
鉴于same_length/2 的频繁纯定义为
same_length([],[]).
same_length([_|As], [_|Bs]) :-
same_length(As, Bs).
?- same_length(L, [_|L]).
loops.
对于这种情况,是否有一个不循环的纯定义?类似于append/3 的纯(但效率较低)版本,称为append2u/3。
我知道如何使用var/1 等手动捕获此类情况,但理想情况下,需要一个与原始定义一样纯的版本。或者至少它应该很简单。
我尝试的是上面的定义。
承诺:将赏金
一项澄清似乎是有序的:
请注意,某些查询本质上不得终止。考虑到:
?- same_length(Ls, Ks).
Ls = [], Ks = []
; Ls = [_A], Ks = [_B]
; Ls = [_A,_B], Ks = [_C,_D]
; Ls = [_A,_B,_C], Ks = [_D,_E,_F]
; Ls = [_A,_B,_C,_D], Ks = [_E,_F,_G,_H]
; ... .
没有其他方法可以使用句法答案替换语言枚举所有解决方案。
但是对于给定的查询,仍然可能会终止一个实现。
【问题讨论】:
-
添加
same_length(L, L) :- \+ length(L, _), !, false.的第一个子句似乎可以解决问题,但它并不纯粹。 -
...如果发生检查被禁用。
-
甚至没有,请参阅#26 所有系统要么循环,要么产生资源错误,要么产生类型错误。
标签: prolog logical-purity