问题标签 [swi-prolog-for-sharing]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 如何使用 python 烧瓶从/向 pyswip 读取/写入?
我试图使用 pyswip 创建一个问答(交互式用户)python swi-prolog 程序,但我找不到使用 python 烧瓶读取/写入 pyswip 的好方法。该应用程序最初是一个 Web 应用程序,我正在使用烧瓶来运行 python 代码。
我有一个向用户提问的功能,定义如下:
问题函数被定义为具有 arity 1 的外部函数,所以在序言中我有这个:
请注意ask(S)
,assertz
这是对问题函数的调用,现在我需要将问题函数的数量更改为 2:
userInput
应该读取用户输入的python解析器在哪里raw_input
,如果您查看问题函数,您会注意到它曾经在函数本身内部完成。
关于如何相应地更改序言部分的任何想法?
types - 在 Prolog 中定义包括函数类型的类型层次结构
在大学学习后,我正在重新访问 Prolog,并想描述一个包含函数类型的类型层次结构。到目前为止,这就是我得到的(SWISH 链接):
该程序适用于以下查询:
然后我为上面的函数子类型添加了以下定义isa
,其中函数是一个复杂的术语func(ArgsTypeList, ResultType)
:
现在,我仍然可以进行一些有限检查,但即使尝试枚举所有子类型的byte
堆栈溢出失败。
我究竟做错了什么?
prolog - 如何绕过未在 SWI-Prolog 在线编辑器上实例化的参数?
我正在使用SWISH编写 Prolog,并且我有一个将分钟转换为小时的程序。
我的分钟输出很好,但是我的小时输出为H = 0+1+1
而不是H = 2
. 有什么办法可以解决这个问题吗?
我尝试过使用 a#=
而不是=
和is
其他人在另一篇文章中推荐的那样,但它在在线编辑器上不起作用,我也无法使用桌面编辑器。
list - 提取列表中两个值之间的项目列表 - prolog
假设我有一个长度为 9 的唯一列表,其中包含 1 和 9 之间的值(包括随机顺序)(想想数独),我想提取出现在值 1 和 9(不包括)之间的项目的子列表. IE:between1and9([1,3,5,4,2,9,7,8,6],[3,5,4,2])
应该是真的。
目前我正在尝试使用flatten/2
,但运气不佳。这是我目前的策略(假设我List ins 1..9, maplist(all_distinct, List), length(List, 9)
在其他地方强制执行以保持此处整洁/关注点分离):
List
当 1 或 9 在 中的第一个或最后一个位置,或者它们在 中相邻时,此版本会失败List
。between1and9([_,1,9,_,_,_,_,_,_],[])
是真的,但是between1and9([_,1,9,_,_,_,_,_,_],_)
是假的(当我试图用它作为约束来解决更大的问题时失败了。)
两次失败似乎都是同一个问题,flatten
似乎不喜欢将未知数视为空列表,除非它们在某处明确。
我可以理解为什么会这样,如果flatten
可以在第一个参数中“发明”空列表,这将意味着第一个参数中任何内容的无限解决方案。尽管我的完整程序有其他限制来防止这种情况,但我可以理解为什么flatten
可能不想适应它。
我可以通过将每个排列与析取匹配来解释边缘情况(双关语)(即:flatten([_,1,B,9,_],L);flatten([_,9,B,1,_],L);flatten([_,1,B,9]);flatten...
,并将 Between 解释为一个空列表:\*above permutations on flatten*\; ( Between = [], (\*permutations for either edge and 1/9*\) )
但这似乎使一个已经冗长的解决方案(总共 10 个 flatten 排列)更糟(18 个)所以我有两个(密切相关的)问题:
如果我能做到以下几点:
我不必手动输入 match for 的每个排列
flatten
。不幸的是,这和它的一些变化都单方面失败了。我在这里遗漏了一些明显的东西吗?(我怀疑运算符优先级,但我尝试了几个不同的版本。)还是我这样做完全错了?文档表明,在大多数情况下,
flatten/2
它是一种反模式,是否有更 prolog-ish* 的方式来解决这个问题?考虑到我在经历这个过程中意识到的所有陷阱,我几乎可以肯定存在。
(对不起,我很痛苦地意识到我用来描述事情的很多术语可能是非常错误的,我只熟悉谓词/形式逻辑,更习惯于描述控制流类型编程。尽管我在实践中对逻辑编程的理解相当好,但我仍在努力寻找一种语言来有力地谈论它,但我会用我得到的任何更正来修改这个问题。)
一些背景:我是序言的新手,通过尝试扩展众多数独求解器中的一个来解决我在几年前打印出来的一些谜题中发现的各种奇怪的数独,来测试我的理解在任何给定行或列中出现在 1 和 9 之间的数字作为额外提示,有点像数独和 picross 的混合。现在的求解器正在运行:SumSudoku(swish)。虽然当你到达它时可能会一团糟。
*推论问题:是否有“pythonic”这个词的序言版本?
prolog - 这在逻辑上和句法上是否正确——嵌套事实?
我正在尝试编写规则,即 D 是我的(我的)女婿,如果他们是男性,而我的女儿是 D 的配偶。当我在 swish 上运行时,除了一些单例变量外,我没有收到任何错误警告。不过,我不相信我写的这个正确..如果这有道理,有人可以为我澄清一下吗?谢谢你。
prolog - 如何删除简单列表中的重复成员 [序言]
编辑:如何删除简单列表中的重复成员
例如 :
[a,b,b,b,c,c,e] 在这个列表中是 2 c 和 3 b 我想删除所有重复的成员结果应该是这样的 [a,e]
请记住,我只是为了作业而学习基础知识,并且我正在使用 swish 在线编译器
prolog - 两个列表至少有一个没有 Prolog 内置谓词的公共元素
我是 prolog 的新手。我想编写 compare_lists/2 来比较 2 个列表,如果它们至少有一个共同元素,则返回 true。我知道这可以用类似的东西来完成
但我想在没有 Prolog 内置谓词的情况下做到这一点。我试着写这个
但是当我问在线嗖嗖序言工具时common_elements([3,13,8,1],[5,3,7,3,1]).
,它回答了真正的 37 次,而不是像 common_list/2 和 common_list2/2 那样的 3 (我必须使用 cut 来获得 1 而不是 3,但这是另一回事)。
swi-prolog - 可靠地找到 quasi_quotations 实现
如何在给定的 SWI-Prolog 中找到哪些 quasi_quotations 实现可用,从源安装,或本地安装的 SWISH ?我试图搜索关键实现
quasi_quotation_syntax
or quasi_quotation
,并且只找到了R
处理程序 inswish/pack/rserve_client
和html
处理程序packages/http/html_quasiquotations.pl
. 我认为,在基本的 SWISH 安装之后,还有更多可以使用的东西。