gpt4 book ai didi

具有可变数量参数的 Prolog 谓词

转载 作者:行者123 更新时间:2023-12-02 07:19:26 27 4
gpt4 key购买 nike

我正在用 PROLOG 编写一个数独求解器。我希望求解器能够处理所有可能大小的数独,因此我自然需要构造采用可变数量参数的谓词。 (例如在数独中构建“ block ”。)

如何构造或模拟具有可变数量参数的谓词?

最佳答案

SWI-Prolog - 与其他一些系统一样 - 提供无限的数量,然后您可以根据需要实际使用“数组”。只需像命名向量一样命名谓词即可。分配器示例:

22 ?- functor(A,a,10).
A = a(_G366, _G367, _G368, _G369, _G370, _G371, _G372, _G373, _G374, _G375).

您更频繁地分配和修改:

30 ?- functor(A,a,4),arg(2,A,ciao).
A = a(_G4841, ciao, _G4843, _G4844).

当然,由于许多 Prolog 习惯用法都基于列表,因此您负责任何算法,但请注意,非确定性(la member/2)可通过 arg 获得。/3。我的意思是,它可以搜索参数索引:

31 ?- arg(A,a(1,2,ciao,4),ciao).
A = 3 ;
false.

编辑由于您要使用库(clpfd),更好的构造函数可能是 =../2

?- length(L, 9), L ins 1..9, A =.. [a | L].
L = [_G3778, _G3781, _G3784, _G3787, _G3790, _G3793, _G3796, _G3799, _G3802],
A = a(_G3778, _G3781, _G3784, _G3787, _G3790, _G3793, _G3796, _G3799, _G3802),
_G3778 in 1..9,
_G3781 in 1..9,
_G3784 in 1..9,
_G3787 in 1..9,
_G3790 in 1..9,
_G3793 in 1..9,
_G3796 in 1..9,
_G3799 in 1..9,
_G3802 in 1..9.

关于具有可变数量参数的 Prolog 谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20777400/

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