标签: prolog

if_/3有什么用?

该谓词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中的非专家可以轻松理解.

if-statement prolog logical-purity

30
推荐指数
2
解决办法
902
查看次数

将Prolog与C#集成

有没有人知道一个很好的(最好是免费的)整合Prolog和C#的方法?

我希望创建一个Prolog dll或类似的来自我的托管代码调用,并在完成所有处理后检索答案.我正在寻找它主要是单面的(c#称为Prolog).

我已经看到这个问题谈论Prologs现实世界的用法,但我想知道是否有人对c#和Prolog有任何经验?还是一个很好的教程/文章?

c# prolog integrate

29
推荐指数
2
解决办法
2万
查看次数

Prolog中==和=有什么区别?

有人可以解释Prolog中===运营商之间的区别吗?我知道这X = Y意味着X与Y统一并且如果X已经与Y统一或者可以与之结合,则为真,但我不明白这是如何不同的==.

跟进:那(见接受的答案)是有道理的.还有一个问题是,是否存在X \= Y真实且X \== Y错误的情况(反之亦然)?也就是说,X \= Y测试它们是否无法统一或者它们目前是否统一?

prolog

29
推荐指数
2
解决办法
4万
查看次数

使Prolog目标的"确定性成功"明确

一些Prolog目标确定性成功的问题一次又一次地出现 - 至少 - 以下问题:

使用了不同的方法(例如,引发某些资源错误,或仔细查看Prolog toplevel给出的确切答案),但它们对我来说都有点不合适.

我正在寻找一种通用的,可移植的,符合ISO的方式来查明某些Prolog目标(成功)的执行是否会留下一些选择点.有些元谓词,也许?

你能否向我提示正确的方向?先感谢您!

prolog

29
推荐指数
1
解决办法
877
查看次数

将成员谓词实现为单行

面试问题!

这是您通常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)

仅使用一个规则定义它.

list prolog dcg

28
推荐指数
3
解决办法
3万
查看次数

使用有限域声明下降/上升坐标的谓词

我想编写一个谓词,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中思考太多是不好的...任何暗示都赞赏.提前致谢. …

logic clojure prolog clojure-core.logic

28
推荐指数
1
解决办法
776
查看次数

prolog中的哈希表

前几天我在prolog中解决了一个谜题,并意识到如果我使用其他编程语言,我会使用哈希表/字典,但据我所知,这在prolog中是不可能的.

所以我的第一个问题是,是否有任何prolog支持类似字典的数据结构与哈希表的性能特征?

其次,我想到,由于大多数prolog使用哈希表来存储谓词,我可以编写一个包装器谓词来断言和收回事实,创建一个字典接口来利用谓词的底层哈希表.但是我会获得散列表的性能特征,还是会增加会降低性能的开销?

dictionary hashtable prolog data-structures

27
推荐指数
2
解决办法
5016
查看次数

如何在Prolog中包含.pl文件?

我想要包含来自其他源文件的代码.有谁知道这是怎么做到的吗?

file prolog include

27
推荐指数
2
解决办法
2万
查看次数

七周后七种语言的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.

prolog

27
推荐指数
1
解决办法
2万
查看次数

`memberd/2`的更多确定性?

许多系统提供了纯粹而有效的实现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,避免选择点如上所述?

list prolog

27
推荐指数
3
解决办法
358
查看次数