小编mat*_*mat的帖子

Prolog工具and / 2,or / 2,nand / 2,nor / 2,xor / 2

我想在序言中实现以下谓词并将它们用于真值表:and / 2或or / 2,nand / 2,nor / 2,xor / 2

也许有人可以向我展示如何实现and / 2,例如,我可以自己做其他人并将其发布在这里。

implementation prolog xor nor clpb

4
推荐指数
1
解决办法
6015
查看次数

在GNU Prolog中生成fibonacci系列的程序给出了实例化错误

这是我的代码: -

fib(0,0).
fib(1,1).
fib(F,N) :-
    N>1,
    N1 is N-1,
    N2 is N-2,
    F is F1+F2,
    fib(F1,N1),
    fib(F2,N2),
    write(F," ,").
Run Code Online (Sandbox Code Playgroud)

在GNU Prolog的咨询中,我得到:

| ?- consult('C:/GNU-Prolog/bin/fib.pl').
compiling C:/GNU-Prolog/bin/fib.pl for byte code...
C:/GNU-Prolog/bin/fib.pl compiled, 3 lines read - 1253 bytes written, 15 ms

yes
| ?- fib(F,2).
uncaught exception: error(instantiation_error,(is)/2)
Run Code Online (Sandbox Code Playgroud)

prolog fibonacci instantiation-error

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

使用Prolog的一个未知的线性方程

我想知道如何解决一个未知的基本线性方程.

我尝试通过字符串拆分来实现它以获得解决方程所需的一切,但我确信有更好的方法.

solve(5 + X = 10).
X = 5.
solve(5+8 = Ans).
Ans = 13.
Run Code Online (Sandbox Code Playgroud)

这是我想要解决的问题.我想用solve/1.

先感谢您.

prolog constraint-programming clpfd

4
推荐指数
1
解决办法
256
查看次数

是否可以将变量的域设置为clpfd中的名称枚举?

我可以用这种方式指定变量的域:

MyVar in 1..10
Run Code Online (Sandbox Code Playgroud)

要么

MyVar in {1,10,15}
Run Code Online (Sandbox Code Playgroud)

但我有一个变量,我想这样指定:

Activity_1__room in {room_1, room_2}  % i.e. as atoms not as integers
Run Code Online (Sandbox Code Playgroud)

有可能吗?当然,可以将名称编码为整数,但这是否真的有必要?

prolog sicstus-prolog clpfd

3
推荐指数
1
解决办法
757
查看次数

如果先前的解决方案不符合某些条件,如何尝试新的排列?

所以,这是我一直试图解决的练习.我得到一个像这样的输入列表[a-b,b-c],它们是连接节点的节点和弧.条件是:

节点需要有一个唯一的编号,从1到N,

和弧需要有一个唯一的编号,从1到N-1,并且该编号必须是减去弧连接的节点的结果.

所以答案是:

EnumNodos = [enum(3,a), enum(1,b), enum(2,c)],
EnumArcos = [enum(2,a?b), enum(1,b?c)]
Run Code Online (Sandbox Code Playgroud)

因为我还没有能够为此提出算法,我也不知道是否有一个算法,我想,我可以尝试每一种可能性,因为我知道如果输入是正确的,有一个解决方案,并且那样早晚我会得到它.

我找到了一个prolog排列的例子,其中,如果我给它一些输入列表,它给出了它的排列.然后(在控制台中),如果我点击';' 它给了我另一个,依此类推.我试图自己包含该代码.

我还没有完成,但我会提供一些帮助,特别是我试图置换选项的"循环"方法.我真的不知道你会怎么说,在prolog中,如果这个动作失败了,尝试另一个新的排列,不同于之前尝试的每个排列(没有给出';'作为解决方案的输入.因为有许多排列正在进行失败,我想检查它是否失败,如果失败,请尝试另一个.

编辑所以我刚刚发现了...我一直在尝试,我想我仍然缺少一个关键部分.截至目前,我觉得我可以通过这个获得我需要的所有可能性列表:setof(Out,perm(ListaEnum, SalidaPerm),X),

但是我仍然遇到FAILING然后重试的想法.到目前为止,我的想法是:我得到了X结果,然后像任何列表一样旅行.我检查它是否有唯一的数字等,如果没有,我想继续旅行那个X.所以我会努力失败而不是成功?我应该这样做吗?

% enumerate(CONNECTIONS_IN, NODES_OUT, ARCS_OUT)
%TODO query example of call: enumerate([a-b,b-c], EnumNodos, EnumArcos).

enumerate(C, EnumNodos, EnumArcos) :-
    enum_nodes(C, [], NodeListUnique, [], PermNodes, 1),
    loopPerm(C, NodeListUnique, EnumArcos, PermNodes, SalidaPerm).

% enum_nodes(CONNECTIONS_IN, NODES_IN, NODES_OUT, IDS_IN, IDS_OUT, START_ID) 
% Fills up NODES_OUT with unique nodes, and PERMOUT with IDS. New IDs start at START_ID...

enum_nodes([], N, N, M, M, …
Run Code Online (Sandbox Code Playgroud)

algorithm prolog clpfd

3
推荐指数
1
解决办法
113
查看次数

逻辑和函数编程之间gcd的实现差异

我目前正在学习编程语言概念和语用学,因此我觉得我需要帮助来区分声明性语言系列的两个子分支.

请考虑以下分别用Scheme和Prolog编写的代码片段:

;Scheme 
(define gcd
    (lambda (a b)
         (cond ((= a b) a)           
               ((> a b) (gcd (- a b) b))
               (else (gcd (- b a) a)))))
Run Code Online (Sandbox Code Playgroud)
%Prolog
gcd(A, B, G) :- A = B, G = A.
gcd(A, B, G) :- A > B, C is A-B, gcd(C, B, G).
gcd(A, B, G) :- B > A, C is B-A, gcd(C, A, G).
Run Code Online (Sandbox Code Playgroud)

我不明白的是:

这两种不同的编程语言如何表现不同?


我们在哪里做出差异,以便将它们归类为基于功能或基于逻辑的编程语言?

就我而言,它们完全相同,调用递归函数直到它终止.

logic scheme functional-programming prolog clpfd

3
推荐指数
2
解决办法
414
查看次数

/ 3之间可以不递归吗?

我看过Prolog Prologue的定义between/3:

between(Lower, Upper, Lower) :-
   Lower =< Upper.
between(Lower1, Upper, X) :-
   Lower1 < Upper,
   Lower2 is Lower1 + 1,
   between(Lower2, Upper, X).
Run Code Online (Sandbox Code Playgroud)

我不明白为什么它需要递归.逻辑定义between可以是:

between(Lower, Upper, Something):-
   Lower =< Upper,
   Lower =< Something,
   Something =< Upper.
Run Code Online (Sandbox Code Playgroud)

我试过它gprolog并且它可以工作,但仅用于简单的查询:

| ?- between(0,5,1).

yes
Run Code Online (Sandbox Code Playgroud)

对于带变量的查询,我得到:

| ?- between(0,5,X).
uncaught exception: error(instantiation_error, (=<)/2)
Run Code Online (Sandbox Code Playgroud)

我真的不明白为什么.

我有点像Prolog需要某种参考数字来统一变量,但为什么会出现神秘错误(=<)/2

prolog instantiation-error

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

为什么我的规则不能用简单的代数方程求解X?

我是Prolog的新手,所以请保持温柔.

这是我的规则:

solve(X) :- A = B, A is (7 * (X - 2)), B is (3 * (X + 4)).
Run Code Online (Sandbox Code Playgroud)

显然,这里的正确答案是6.5.如果我把它交给Prolog,它确认:

| ?- solve(6.5).

yes
Run Code Online (Sandbox Code Playgroud)

但是,如果我让Prolog做脏工作,它会抛出一个错误:

| ?- solve(X).
uncaught exception: error(instantiation_error,(is)/2)
Run Code Online (Sandbox Code Playgroud)

我完全承认,这里发生的一切都是由于我对Prolog的误解.有人可以向我解释我是如何让这个工作或为什么它不起作用?

prolog constraint-programming

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

Prolog :: f(x)递归

我是Prolog的初学者,有两个要求:

  1. f(1) = 1

  2. f(x) = 5x + x^2 + f(x - 1)

规则:

f(1,1). f(X,Y) :- Y is 5 * X + X * X + f(X-1,Y).

查询:

f(4,X).

输出:

ERROR: is/2: Arguments are not sufficiently instantiated

如何添加f(X-1)的值?

recursion arithmetic-expressions prolog instantiation-error

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

以边界限制器为元素的子列表

我有一个像这样的列表的基本谓词:

sublist(List, Offset, Length, Sublist)


sublist(List, Offset, Length, Sublist):-
    length(Prefix, Offset),
    append(Prefix, Rest, List),
    length(Sublist, Length),
    append(Sublist, _, Rest).
Run Code Online (Sandbox Code Playgroud)

它从给定长度的初始列表中的第一个元素返回一个子列表.

6 ?- sublist([a,b,c,d,e,f,g,h,i,j,k], 3, 6, X).
X = [d, e, f, g, h, i].
Run Code Online (Sandbox Code Playgroud)

我想用一个下限和上限来转换这个谓词,它直接是原始列表的元素,就像这样

sublist([a,b,c,d,e,f,g,h,i,j,k], d, i, X).
X = [d, e, f, g, h, i].
Run Code Online (Sandbox Code Playgroud)

这该怎么做?

predicate list prolog dcg

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