标签: iso-prolog

GNU Prolog断言错误

我是Prolog的新手,但我仍然坚持这个简单的命令.我已经加载了一个没有错误的知识库,每当我尝试断言(甚至帮助)时,我都收到以下消息:

uncaught exception: error(existence_error(procedure,assert/1),top_level/0)
{2}
Run Code Online (Sandbox Code Playgroud)

我究竟缺少什么?赞赏.

prolog gnu-prolog iso-prolog prolog-assert

7
推荐指数
1
解决办法
1804
查看次数

是否有prolog语言语法/规范?

是否有一个prolog语言语法,或接近它的东西,通常用作参考?我正在使用SWI-prolog,所以对于那种味道会很好,否则一般的prolog语言语法/规范也可以.

grammar prolog iso-prolog

7
推荐指数
1
解决办法
1051
查看次数

是一个无限的清单?

在Prolog中,统一X = [1|X]是一种获得无限列表的理智方式吗?SWI-Prolog没有任何问题,但GNU Prolog只是挂起.

我知道在大多数情况下我可以替换列表

one(1).
one(X) :- one(X).
Run Code Online (Sandbox Code Playgroud)

但我的问题是明确是否可以X = [1|X], member(Y, X), Y = 1在"理智"的Prolog实现中使用该表达式.

list prolog cyclic iso-prolog coinduction

7
推荐指数
1
解决办法
629
查看次数

swi-prolog和yap的结果不同

示例程序枚举并计算8-queen解决方案的数量.(对不起代码很难读;这是用S-expression机器生成的.原始代码是https://www.cpp.edu/~jrfisher/www/prolog_tutorial/2_11.html)

规则:

[user].
(perm([X|Y],Z) :- (perm(Y,W),takeout(X,Z,W))).
perm([],[]).
takeout(X,[X|R],R).
(takeout(X,[F|R],[F|S]) :- (takeout(X,R,S))).
(solve(P) :- (perm([1,2,3,4,5,6,7,8],P),combine([1,2,3,4,5,6,7,8],P,S,D),alldiff(S),alldiff(D))).
(combine([X1|X],[Y1|Y],[S1|S],[D1|D]) :- (is(S1,+(X1,Y1)),is(D1,-(X1,Y1)),combine(X,Y,S,D))).
combine([],[],[],[]).
(alldiff([X|Y]) :- (\+ member(X,Y),alldiff(Y))).
alldiff([X]).
end_of_file.
Run Code Online (Sandbox Code Playgroud)

查询:

(setof(P,solve(P),Set),length(Set,L),write(L),write('\n'),fail).
Run Code Online (Sandbox Code Playgroud)

swipl返回92; 而yap返回40320.此外,当我查询时solve(P),swipl只返回两个解决方案(这也与92相矛盾); yap返回更多(可能是40320).为什么差异呢?有这么严重的兼容性问题吗?

版本:

  • YAP 6.2.2(x86_64-linux):2016年9月17日星期六13:59:03 UTC
  • 适用于amd64的SWI-Prolog版本7.2.3

prolog iso-prolog

7
推荐指数
1
解决办法
148
查看次数

Prolog是否有条件并重启系统,如Common Lisp?

Common Lisp允许通过条件和重新启动进行异常处理.粗略地说,当函数抛出异常时,"捕手"可以决定"投掷者"应该如何进行.Prolog是否提供类似的系统?如果没有,是否可以在现有谓词的基础上构建一个步行和检查调用堆栈?

prolog iso-prolog

6
推荐指数
1
解决办法
350
查看次数

在SWI-Prolog的forall子句中使用成员是否总是以相同的顺序输出元素?

最近进入Prolog我已经将它用于一些简单的任务,并开始怀疑在forall循环中使用成员,如下面的简单示例中的那个:

forall(member(A,[1,2,3,4]), print(A)).
Run Code Online (Sandbox Code Playgroud)

如果您执行类似这样的操作,那么forall每次调用时都会以相同的顺序处理列表中的元素吗?是否必须通过执行以下操作来强制执行:

A = [1,2,3,4], sort(A, B), forall(member(C,B), print(C)).
Run Code Online (Sandbox Code Playgroud)

从我最初做的小研究中我猜测它归结为member/2的行为,但SWI-Prolog网站上的功能文档非常简短.然而它确实提到了关于成员/ 2的确定性,这给了我一个暗示,我可能正在说道,它总是以相同的顺序提取元素,尽管我很不确定.

有人能给我任何保证或解释吗?

prolog swi-prolog iso-prolog

6
推荐指数
1
解决办法
2423
查看次数

如何在Prolog中模拟软切?

如何模拟软切割 I* - > T; E在ISO Prolog中?我有副作用,所以我不能多次调用它.

除了最后一个要求,我认为以下定义有效:

if_(I, T, E) :-
    not(not(I)) ->
    call((I, T));
    call((not(I), E)).
Run Code Online (Sandbox Code Playgroud)

(我实际上正在使用XSB prolog; XSB的解决方案对我也很有用.)

prolog xsb iso-prolog

6
推荐指数
1
解决办法
387
查看次数

这个 Prolog 术语是否正确?(事实、规则、程序、谓词……)

获得正确的术语是成功传达概念的一部分,当在 SO 中使用错误的术语时,带有 Prolog 标签的受访者会很好地指出错误。

在阅读 William F. Clocksin 于 1997 年 ( WorldCat ) 的“条款和效果 - 工作程序员的序言编程”时,是一段

Prolog程序由一组过程组成。每个过程定义一个特定的谓词,作为其参数之间的某种关系。一个过程由一个或多个断言子句组成。考虑两种条款很方便:事实规则

虽然我理解所有单词,但在交流 Prolog 时,每个粗体单词是否都是当前正确使用的术语?

特别是规则的使用似乎不受欢迎。

terminology prolog iso-prolog

6
推荐指数
1
解决办法
1413
查看次数

以编程方式编写和读取术语时是否可以保留变量名称?

我正在尝试编写一个适用numbervars/3于术语匿名变量的SWI-Prolog谓词,但保留用户提供的非匿名变量名称.我最终计划添加一些钩子term_expansion(或类似的东西).

期望输出的示例:

    ?- TestList=[X,Y,Z,_,_].
       > TestList=[X,Y,Z,A,B].
Run Code Online (Sandbox Code Playgroud)

对YAP prolog保留变量名称的转换术语到原子的问题的答案显示了如何使用read_term获取术语中使用的变量名称作为原子.此列表(格式为[X ='X',Y ='Y',...])不包含匿名变量,与获取的变量列表不同term_variables,使匿名变量的隔离相当简单.

然而,如果它只能应用于直接从终端读取的术语,则这个伟大特征的有用性有些限制.我注意到答案中的所有示例都涉及该术语的直接用户输入.是否有可能获得(作为原子)通过直接用户输入获得的术语的变量名称?也就是说,是否有某种方法可以将一个术语(保留变量名称)"写入"某个不可见的流,然后"读取"它就好像它是从终端输入的一样?

或者......也许这更像是一种LaTeX-ish思路,但是在Prolog扩展/尝试将它们统一为变量之前,有一些方法可以将变量"包装"在单引号内(从而原子化它们)最终结果是它们被视为以大写字母而不是变量开头的原子?

variables io stream prolog iso-prolog

6
推荐指数
1
解决办法
119
查看次数

析取算子和定义与几个规则的等价性

我只是偶然在定义;/2SWI Prolog的手册的规定:

The `or' predicate is defined as:

Goal1 ; _Goal2 :- Goal1.
_Goal1 ; Goal2 :- Goal2.
Run Code Online (Sandbox Code Playgroud)

这是否意味着;/2行为完全像我们编写自己的包含两个规则的辅助谓词一样?我记得这;/2是一个不纯的结构(但我可能将它与if-then-else混合在一起)但这个定义是纯粹的(虽然是元逻辑的).

语义;/2在第7.8.6段的ISO标准中定义,但这是在操纵当前状态,选择点等方面完成的.

SWI手册中的定义是否等同于ISO定义?如果不是,你知道他们不同的例子吗?

prolog iso-prolog

6
推荐指数
1
解决办法
106
查看次数