gpt4 book ai didi

prolog - 如何改进这段在列表中查找特定数字的代码?

转载 作者:行者123 更新时间:2023-12-01 11:18:55 24 4
gpt4 key购买 nike

我正在编写用于查找特定数字的序言代码;如果数字介于 0 和 9 之间并且不存在于给定列表中,则该数字是正确的数字。为此,我编写了一个谓词 number/3,它的第一个参数是可能的数字,Rightnumber 不能出现的列表和神秘的 RightNumber 作为第三个参数:

number([XH|XT], [H|T], RightNumber):-
member(XH, [H|T]), !,
number(XT, [H|T], RightNumber).
number([XH|_], [H|T], XH):-
\+ member(XH, [H|T]).

所以这段代码基本上是说,如果可能数字列表的头部已经是第二个列表的成员,则切断头部并继续递归尾部。如果该元素不在第二个列表中,则第二个子句触发并告诉 prolog 该数字是 RightNumber。没关系,它只给出可能的第一个数字,这就是我想要使用它的方式。

这段代码在理论上是可行的,但我想知道是否有更好的方法将其写下来?我稍后在我的代码中的另一个谓词中使用这个谓词,但它不作为其中的一部分工作。我认为它只读取了第一个子句,而不是第二个子句,因此失败了。

有没有人有可以改进我的代码的想法?

示例查询:

?- number([0,1,2,3,4,5,6,7,8,9], [1,2], X).
X = 3
?- number([0,1,2,3,4,5,6,7,8,9], [1,2,3,4,5,6,7,8,0], X).
X = 9

最佳答案

首先,代码有效。考虑:

?- number(Xs, Ys, N).nontermination

这显然不好:对于这个所谓的最一般的查询,我们期望获得答案,但 Prolog 没有给我们这个程序的任何答案!

因此,我首先建议您从程序中消除所有杂质,并专注于对您想要的内容进行清晰的声明性描述。

我给你一个开始:

good_number(N, Ls) :-        N in 0..9,        maplist(#\=(N), Ls).

这表明关系为真if N 在 0 和 9 之间, N 不同来自 Ls 中的任何整数。参见 有关 CLP(FD) 约束的更多信息。

重要的是,这适用于所有 方向。例如:

?- good_number(4, [1,2,3]).true.?- good_number(11, [1,2,3]).false.?- good_number(N, [1,2,3]).N in 0\/4..9.

在最一般的情况下,也是:

?- good_number(N, Ls).Ls = [],N in 0..9 ;Ls = [_2540],N in 0..9,N#\=_2540 ;Ls = [_2750, _2756],N in 0..9,N#\=_2756,N#\=_2750 .

仅用两行代码,我们就实现了一个非常通用的关系。

另见 获取更多信息。

关于prolog - 如何改进这段在列表中查找特定数字的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46651641/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com