【问题标题】:Prolog predicate with variable number of arguments具有可变数量参数的 Prolog 谓词
【发布时间】:2013-12-25 22:49:32
【问题描述】:

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

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

【问题讨论】:

  • 使用列表结构。
  • 您能详细说明一下吗?我不太清楚你的意思。
  • Prolog 没有可变参数能力,但您可以使用列表。因此,您可以通过 length(L, 5), my_predicate(L) 传递一个固定长度的可变列表结构,传递一个包含 5 个未实例化元素的列表。或者您可以动态创建列表。有关列表过程的更多信息,请参阅例如ling.helsinki.fi/kit/2004k/ctl272/Bangor/clbook_20.html。如果你想要一个 3x3 数独块,你可以传递一个包含 9 个元素的列表,或者一个包含 3 个列表的列表,每个列表包含 3 个元素。
  • 网上也有几个数独求解器的例子,比如这里:programmablelife.blogspot.com/2012/07/…

标签: prolog variadic-functions predicate


【解决方案1】:

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.

edit 因为你要使用 library(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.

【讨论】:

    猜你喜欢
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多