我想在序言中实现以下谓词并将它们用于真值表:and / 2或or / 2,nand / 2,nor / 2,xor / 2
也许有人可以向我展示如何实现and / 2,例如,我可以自己做其他人并将其发布在这里。
这是我的代码: -
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) 我想知道如何解决一个未知的基本线性方程.
我尝试通过字符串拆分来实现它以获得解决方程所需的一切,但我确信有更好的方法.
solve(5 + X = 10).
X = 5.
solve(5+8 = Ans).
Ans = 13.
Run Code Online (Sandbox Code Playgroud)
这是我想要解决的问题.我想用solve/1.
先感谢您.
我可以用这种方式指定变量的域:
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)
有可能吗?当然,可以将名称编码为整数,但这是否真的有必要?
所以,这是我一直试图解决的练习.我得到一个像这样的输入列表[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) 我目前正在学习编程语言概念和语用学,因此我觉得我需要帮助来区分声明性语言系列的两个子分支.
请考虑以下分别用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)
我不明白的是:
这两种不同的编程语言如何表现不同?
我们在哪里做出差异,以便将它们归类为基于功能或基于逻辑的编程语言?
就我而言,它们完全相同,调用递归函数直到它终止.
我看过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的新手,所以请保持温柔.
这是我的规则:
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的初学者,有两个要求:
f(1) = 1
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)的值?
我有一个像这样的列表的基本谓词:
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)
这该怎么做?