gpt4 book ai didi

prolog - 我的 Prolog "list filler"有什么问题吗?

转载 作者:行者123 更新时间:2023-12-02 08:49:29 25 4
gpt4 key购买 nike

我编写了一个简单的程序来尝试使用满足特定约束的元素填充给定长度的列表。

例如,我想创建一个 0 到 9 之间的 4 个整数的列表,其中至少包含 34。我可以想到几个(实际上是数千个)这样的列表:

[3,4,0,0]
[0,3,4,0]
[3,1,9,4]
etc...

但是 SWI Prolog 只返回 false。我只是犯了某种逻辑错误,还是我错误地使用了 Prolog?

我的代码:

is_single_digit_integer(N) :-
integer(N),
between(0, 9, N).

filled_list(Given, FillConstraint, OutLen, Out) :-
is_list(Out),
length(Out, OutLen),
length(Given, GivenLen),
between(0, OutLen, GivenLen),
maplist(FillConstraint, Out),
subset(Given, Out).

并运行我描述的示例:

?- filled_list([3,4], is_single_digit_integer, 4, X).

最佳答案

我想用一个简短的指针来补充丹尼尔的答案 :

一般 Prolog 程序的via regia是使用谓词来满足您期望从逻辑关系中得到的属性。这样的谓词被称为单调

例如,在您的特定情况下,您使用非单调谓词integer/1is_list/1。如果您改为使用可以在所有方向使用的谓词,您的问题就会完全消失,例如:

is_single_digit_integer(N) :-  N in 0..9.

这使用 约束 (in)/2 来说明:N 是 0 到 9 之间的整数

它适用于以下所有情况:

?- is_single_digit_integer(N).N in 0..9.?- is_single_digit_integer(3).true.?- is_single_digit_integer(20).false.

相比之下,integer/1不完整:

?- integer(N).false.

→ 没有整数存在??

这同样适用于 is_list/1,它对于最通用的查询来说已经严重不足:

?- is_list(Ls).false.

相反,要声明 Ls 是一个列表,您可以使用:

length(Ls, _)

无论是否 Ls 被实例化,它都能正常工作。例如:

?- length(Ls, _).Ls = [] ;Ls = [_6650] ;Ls = [_6650, _6656] ;Ls = [_6650, _6656, _6662] ;etc.

为了充分利用 Prolog,我建议保留其纯粹且单调的子集。这为可以在各个方向使用的关系铺平了道路。

关于prolog - 我的 Prolog "list filler"有什么问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46308000/

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