该谓词if_/3似乎在Stack Overflow的Prolog部分的少数主要贡献者中相当受欢迎.
这个谓词是这样实现的,由@false提供:
if_(If_1, Then_0, Else_0) :-
call(If_1, T),
( T == true -> call(Then_0)
; T == false -> call(Else_0)
; nonvar(T) -> throw(error(type_error(boolean,T),_))
; /* var(T) */ throw(error(instantiation_error,_))
).
Run Code Online (Sandbox Code Playgroud)
但是,我一直无法找到这个谓词的作用的清晰,简单和简洁的解释,以及它与Prolog的经典if-then-else结构相比有什么用处if -> then ; else.
我发现的大多数链接直接使用这个谓词,并且提供了很少的解释,为什么它被使用,Prolog中的非专家可以轻松理解.
有没有人知道一个很好的(最好是免费的)整合Prolog和C#的方法?
我希望创建一个Prolog dll或类似的来自我的托管代码调用,并在完成所有处理后检索答案.我正在寻找它主要是单面的(c#称为Prolog).
我已经看到这个问题谈论Prologs现实世界的用法,但我想知道是否有人对c#和Prolog有任何经验?还是一个很好的教程/文章?
有人可以解释Prolog中==和=运营商之间的区别吗?我知道这X = Y意味着X与Y统一并且如果X已经与Y统一或者可以与之结合,则为真,但我不明白这是如何不同的==.
跟进:那(见接受的答案)是有道理的.还有一个问题是,是否存在X \= Y真实且X \== Y错误的情况(反之亦然)?也就是说,X \= Y测试它们是否无法统一或者它们目前是否统一?
一些Prolog目标确定性成功的问题一次又一次地出现 - 至少 - 以下问题:
使用了不同的方法(例如,引发某些资源错误,或仔细查看Prolog toplevel给出的确切答案),但它们对我来说都有点不合适.
我正在寻找一种通用的,可移植的,符合ISO的方式来查明某些Prolog目标(成功)的执行是否会留下一些选择点.有些元谓词,也许?
你能否向我提示正确的方向?先感谢您!
面试问题!
这是您通常member在Prolog中定义关系的方式:
member(X, [X|_]). % member(X, [Head|Tail]) is true if X = Head
% that is, if X is the head of the list
member(X, [_|Tail]) :- % or if X is a member of Tail,
member(X, Tail). % ie. if member(X, Tail) is true.
Run Code Online (Sandbox Code Playgroud)
仅使用一个规则定义它.
我想编写一个谓词,descendo,它声明第一个给定坐标[y,x]下降到第二个给定坐标(想象左上角有[0,0]的板).
Prolog中一个非常简单的实现可能如下所示:
descending(B, A) :-
B = [B1,B2],
A = [A1,A2],
B1 is A1 + 1,
B2 is A2 + 1.
Run Code Online (Sandbox Code Playgroud)
我没有在core.logic中实现这一点.我已经尝试了很多不同的东西(==/= fd/conso/appendo和+ fd/+).我试过的一件事:
(defn descendo
[b a]
(l/fresh [b1 b2 a1 a2]
(l/== b [b1 b2])
(l/== a [a1 a2])
(l/+fd b1 1 a1)
(l/+fd b2 1 a2)))
Run Code Online (Sandbox Code Playgroud)
大多数人在运行它们时只返回任何内容:
(l/run* [q]
(l/fresh [a]
(l/infd a (l/domain [0 0] [1 0] [0 1] [1 1]))
(descendo a [0 0])
(l/== q a)))
=> () ; expected output: ([1 1])
Run Code Online (Sandbox Code Playgroud)
我觉得在使用core.logic时,在Prolog中思考太多是不好的...任何暗示都赞赏.提前致谢. …
前几天我在prolog中解决了一个谜题,并意识到如果我使用其他编程语言,我会使用哈希表/字典,但据我所知,这在prolog中是不可能的.
所以我的第一个问题是,是否有任何prolog支持类似字典的数据结构与哈希表的性能特征?
其次,我想到,由于大多数prolog使用哈希表来存储谓词,我可以编写一个包装器谓词来断言和收回事实,创建一个字典接口来利用谓词的底层哈希表.但是我会获得散列表的性能特征,还是会增加会降低性能的开销?
我只是关注七周七语言一书.
我已经使用命令在我的Mac机器上安装了gprolog port install gprolog-devel并运行了第一个prolog代码.
likes(wallace, cheese).
likes(grommit, cheese).
likes(wendolene, sheep).
friend(X, Y) :- \+(X = Y), likes(X, Z), likes(Y, Z).
Run Code Online (Sandbox Code Playgroud)
如果我输入likes(wallace, cheese).prolog解释器,我就有错误
未捕获的异常:错误(exist_error(procedure,likes/2),top_level/0).
Prolog 1.3.1无法安装在我的Mac上,我正在使用prolog 1.4.0.
许多系统提供了纯粹而有效的实现member/2.特别是,没有选择点可供选择:
?- member(b,[a,b]).
true.
Run Code Online (Sandbox Code Playgroud)
然而,member/2生产的天真实施相当:
?- member(b,[a,b]).
true ;
false.
Run Code Online (Sandbox Code Playgroud)
从声明的角度来看肯定是正确的,但效率较低.
另一方面,存在一些技术问题member/2.它允许冗余解决方案,如:
?- member(a,[a,a]).
true ;
true.
Run Code Online (Sandbox Code Playgroud)
memberd/2使用if_/3和解决这个问题(=)/3.
memberd(E, [X|Xs]) :-
if_(E = X, true, memberd(E, Xs)).
?- memberd(a,[a,a]).
true.
Run Code Online (Sandbox Code Playgroud)
不幸的是,这个定义使选择点再次打开 - ; false在成员不这样做的情况下产生("剩余的选择点"):
?- memberd(X,[a,b]).
X = a ;
X = b ;
false. % BAD - to be avoided!
?- member(X,[a,b]).
X = a ;
X = b.
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:是否有一个定义memberd/2,避免选择点如上所述?