首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有可变参数数的Prolog谓词

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

Stack Overflow用户
提问于 2013-12-25 22:49:32
回答 1查看 4.3K关注 0票数 5

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

如何使用可变数量的参数来构造或模拟谓词?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-26 11:01:40

SWI-Prolog -和其他一些系统一样-提供无限的可用性,如果您愿意的话,您实际上可以使用“数组”。只需像对向量那样命名谓词即可。示例分配器:

代码语言:javascript
复制
22 ?- functor(A,a,10).
A = a(_G366, _G367, _G368, _G369, _G370, _G371, _G372, _G373, _G374, _G375).

更多情况下,您分配和修改:

代码语言:javascript
复制
30 ?- functor(A,a,4),arg(2,A,ciao).
A = a(_G4841, ciao, _G4843, _G4844).

当然,由于许多Prolog成语都是基于列表的,所以任何算法都由您负责,但是请注意,通过arg/3可以获得不确定性( la member/2)。我的意思是,它可以搜索论点索引:

代码语言:javascript
复制
31 ?- arg(A,a(1,2,ciao,4),ciao).
A = 3 ;
false.

由于您要使用库(Clpfd),一个更好的构造函数可以是=.。/2

代码语言:javascript
复制
?- 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.
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20777400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档