我已经在一本书中读到了它,但根本没有解释.我也从未在程序中看到它.是Prolog语法的一部分吗?这是为了什么?你用它吗?
对Prolog谓词控制有好奇心.
据说我有一个谓词f(A,X)和g(B).
f(A,X):- a,b,c, g(X).
g(B):- true.
a - returns true
b - returns true.
c - returns false.
where a,b and c are random predicates.
Run Code Online (Sandbox Code Playgroud)
如果c返回false,我如何继续g(X)在谓词中进行求值f(A,X)?
它们存在吗?他们是如何实施的?
所述coroutining SWI-Prolog的(的谓词freeze,when,dif等)具有的功能警卫.它们如何适合首选的Prolog编程风格?
我是很新的逻辑编程(有序言和共)和事实,即它不是纯粹的声明,并要求即使在非常简单的情况下程序上的考虑有点困惑(见本关于使用问题\==或dif).我错过了重要的事吗?
我查看了手册和文档,但仍然不明白.我正在尝试实现一个数独解决方案,在写出游戏的所有其他规则后,我根据老师的指示添加了标签(Board).
但是我仍然没有得到它的工作原理或它正在做什么.不应该有其他约束(我有检查说数字必须是1..9,行必须全部不同,等等)给我自己的答案?
我制作了以下小程序来确定用于目标的内存freeze(X,Goal)是否在X无法访问时被回收:
%:- use_module(library(freeze)). % Ciao Prolog needs this
freeze_many([],[]).
freeze_many([_|Xs],[V|Vs]) :-
freeze(V,throw(error(uninstantiation_error(V),big_freeze_test/3))),
freeze_many(Xs,Vs).
big_freeze_test(N0,N,Zs0) :-
( N0 > N
-> true
; freeze_many(Zs0,Zs1),
N1 is N0+1,
big_freeze_test(N1,N,Zs1)
).
Run Code Online (Sandbox Code Playgroud)
我们运行以下查询......
?- statistics, length(Zs,1000), big_freeze_test(1,500,Zs), statistics.
Run Code Online (Sandbox Code Playgroud)
...使用不同的Prolog处理器并查看内存消耗情况. 有什么区别!
(AMD64) SICStus Prolog 4.3.2 : global stack in use = 108 MB (AMD64) B-Prolog 8.1 : stack+heap in use = 145 MB (i386) Ciao Prolog 1.14.2: global stack in use = 36 MB (~72 MB w/AMD64) (AMD64) SWI-Prolog 7.3.1 : …
我开始学习Prolog之后的Prolog 编程:使用ISO标准.在介绍到,他们所作的断言语言的7页:"在序言答案没有被用来指没有与问题相结合,以记住,这是非常重要的.没有是不一样的错误." 那么为什么SWI-Prolog使用false和true语句代替yes或no?
prolog ×6
clpfd ×1
guard-clause ×1
operators ×1
predicate ×1
prolog-dif ×1
sudoku ×1
swi-prolog ×1