可能是一个愚蠢的问题,但我无法在任何地方找到任何文档.有没有办法在prolog中执行if,例如,如果变量为0,则执行某些操作(将文本写入终端).甚至不需要else,但我找不到if的任何实现.
如何在一个符合标准的方式写入avs_term_rearranged(AVs, T, AVsR)与给定的AVs和T,使得AVsR是的置换AVs作为其变量发生在左到右的顺序与布置在相同的顺序中的元素T.
AVs是一个表单元素的列表,A = V其中A一个原子指定一个变量名称,'X'并且V是一个相应的变量.这些列表由read_term/2,3read-option variable_names/1(7.10.3)生成.另外,没有定义元素的精确顺序.
| ?- read_term(T,[variable_names(AVs)]).
A+B+A+_+C.
AVs = ['A'=A,'B'=B,'C'=C]
T = A+B+A+_+C
Run Code Online (Sandbox Code Playgroud)
T是一个包含所有变量AVs加上更多的变量的术语.
请注意,在标准符合程序中,不能依赖变量的术语顺序(7.2.1):
7.2.1变量
如果
X和Y是不相同的变量,则Xterm_precedesY应依赖于实现,除了在创建排序列表(7.1.6.5,8.10.3.1 j)期间,排序应保持不变.注 - 如果
X和Y都是匿名变量,则它们不是相同的术语(见6.1.2 a).
以8.4.3.4为例:
sort([f(U),U,U,f(V),f(U),V],L).
Succeeds, unifying L with [U,V,f(U),f(V)] or
[V,U,f(V),f(U)].
[The solution is implementation …Run Code Online (Sandbox Code Playgroud) 我是Prolog的新手并注意到'和'给出了不同的行为,但我很好奇为什么.具体来说,加载文件时,?- ['test1.pl'].工作,而?- ["test1.pl"].不是.
在ISO Prolog中,仅针对NSTO(不受发生检查)的情况定义统一.背后的想法是涵盖那些主要用于程序并且实际上得到所有Prolog系统支持的统一案例.更具体地说,ISO/IEC 13211-1:1995读取:
7.3.3发生检查(STO)但不受
发生检查(NSTO)
如果存在通过
Herbrand算法的步骤以便
发生7.3.2g 的方式,则一组方程(或两个项)是"经历发生 - 检查"(STO).
如果没有办法继续
Herbrand算法的步骤使得7.3.2g发生,则一组方程(或两个项)"不受发生检查"(NSTO)
....
此步骤7.3.2 g读取:
克)如果存在形式的公式X =吨这样
即X是一个变量,吨是非可变术语
包含该变量,然后用失败(退出不
unifiable,正发生检查).
完整的算法被称为Herbrand算法,并且通常被称为Martelli-Montanari统一算法 - 其基本上通过以非确定性方式重写方程组来进行.
请注意,引入了新的方程式:
d)如果存在形式为f(a 1,a 2,... a N)=
f(b 1,b 2,... b N)的等式,则将其替换为等式集
a i = b 我.
这意味着具有相同算符但具有不同arity的两个复合词将永远不会对STO-ness做出贡献.
这种非确定性使得STO测试难以实现.毕竟,仅仅测试是否需要发生检查是不够的,但为了证明对于执行算法的所有可能方式,这种情况永远不会发生.
这是一个案例来说明情况:
?- A/B+C*D = 1/2+3*4.
Run Code Online (Sandbox Code Playgroud)
统一可以从A = 1,也可以是任何其他对开始,并以任何顺序继续.为了确保NSTO属性,必须确保没有可能产生STO情况的路径.考虑一个对当前实现没有问题的情况,但仍然是STO:
?- 1+A = …Run Code Online (Sandbox Code Playgroud) 标准术语顺序(ISO/IEC 13211-1 7.2术语顺序)是在所有术语(包括变量)上定义的.虽然有很好的用途 - 想想实现setof/3,但这使得许多其他清洁和逻辑用途的内置插件在8.4 Term比较中声明性的噩梦与imps(命令式构造的简短形式)四处都有.8.4术语比较功能:
8.4术语比较
8.4.1(@ = <)/ 2,(==)/ 2,(\ ==)/ 2,(@ <)/ 2,(@>)/ 2,(@> =)/ 2.
8.4.2比较/ 3.
8.4.3 sort/2.
8.4.4 keysort/2.
举个例子,考虑一下:
?- X @< a.
true.
Run Code Online (Sandbox Code Playgroud)
这成功了,因为
7.2期限订单
命令term_precedes(3.181)定义
术语X术语是否在术语之前Y.如果
X且Y是相同的术语,则Xterm_precedesY
和Yterm_precedesX都是假的.如果
X和Y有不同的类型:Xterm_precedesY当且仅当该
类型X先于类型Y按以下顺序:
variable先floating point先于integer
先 …
我在Lee Naish的论文"Prolog中的高阶逻辑编程"中遇到了一些不熟悉的Prolog语法.以下是本文的第一个代码示例:
% insertion sort (simple version)
isort([], []).
isort(A.As, Bs) :-
isort(As, Bs1),
isort(A, Bs1, Bs).
% insert number into sorted list
insert(N, [], [N]).
insert(N, H.L, N.H.L) :-
N =< H.
insert(N, H.LO, H.L) :-
N > H,
insert(N, LO, L).
Run Code Online (Sandbox Code Playgroud)
我的困惑是A.As在isort(A.As, Bs) :-.从上下文来看,它似乎是列表的替代cons语法,相当于isort([A|As], Bs) :-.
也N.H.L似乎是一个更方便的方式来表达[N|[H|L]].
但SWI Prolog不接受这种不寻常的语法(除非我做错了).
有谁认出来了吗?我的假设是正确的吗?哪个Prolog解释器接受它作为有效语法?
我有这段代码:
% Family tree
female(pen).
male(tom).
male(bob).
female(liz).
female(pat).
female(ann).
male(jim).
parent(pam, bob).
parent(tom, bob).
parent(tom, liz).
parent(bob, ann).
parent(bob, pat).
parent(pat, jim).
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
Warning: Clauses of female/1 are not together in source-file
Warning: Clauses of male/1 are not together in source-file
Run Code Online (Sandbox Code Playgroud)
这个错误的目的是什么?
我的意思是,文件编译并运行得很好,我知道错误的含义.但为什么?
这只是强制执行最佳做法的通知吗?
我对逻辑编程很新.
谢谢!
Javascript似乎成为其他编程语言的实现语言.文章 轻量级编译(C)LP到JavaScript.ICLP 2012 引起了我的注意.
在Web上用Javascript编写的Prolog系统有很多概念验证原型.
什么是当前的,积极维护的,最好是用Javascript编写的符合ISO标准的Prolog系统?
ISO-Prolog(ISO/IEC 13211-1:1995,包括Cor.1:2007,Cor.2:2012)提供了以下用于测试术语类型的内置谓词:
8.3型式试验
1 var/1.2原子/ 1.3整数/ 1.4浮点/ 1.5原子/ 1.6化合物/ 1.7 nonvar/1.8号/ 1.9可赎回/ 1.10地/ 1.11 acyclic_term/1.
在这一组中有那些目的只是为了测试某种实例,即8.3.1 var/1,8.3.7 nonvar/1,8.3.10 ground/1,而那些假设长期充分实例化使得型式试验是安全的.不幸的是,它们与测试具体实例相结合.
考虑目标integer(X),其失败,如果X是一个nonvar术语,不是一个整数,并当X是一个变量.这破坏了许多理想的声明属性:
?- X = 1, integer(X).
true.
?- integer(X), X = 1.
false.
Run Code Online (Sandbox Code Playgroud)
理想情况下,第二个查询将使用某种形式的coroutining成功; 或者根据错误分类发出实例化错误1.毕竟:
7.12.2错误分类
错误根据Error_term的形式分类:
a)当
参数或其中一个组件是变量并且需要
实例化的参数或组件时,应该存在实例化错误.它有
形式instantiation_error....
请注意,实例化测试和类型测试的这种隐式组合会导致Prolog程序中的许多错误,并且也会出现在SO上.
对这种情况的快速解决方法是在内置的每个测试之前添加一个显式测试,或者详细说明
( var(T) -> throw(error(instantiation_error,_)) ; true),
integer(T), ....
Run Code Online (Sandbox Code Playgroud)
或更紧凑
functor(T, _,_),
integer(T), ....
Run Code Online (Sandbox Code Playgroud)
它甚至可以
T =.. _,
integer(T), …Run Code Online (Sandbox Code Playgroud) 如果两个唯一变量列表包含完全相同的变量,使用当前ISO标准(ISO/IEC 13211-1:1995,包括Cor.)的内置插件,如何定义测试(因此成功或失败)的元逻辑谓词. 2).
换句话说,如果一个唯一变量列表是另一个变量的排列,则谓词应该成功.与library(ordsets)此类推,我们称之为元逻辑谓词 varset_seteq(As, Bs).
请注意,与此相反ord_seteq/2,这个谓词不能简单As == Bs.
iso-prolog ×10
prolog ×10
algorithm ×1
compilation ×1
dcg ×1
javascript ×1
prolog-dif ×1
sorting ×1
transpiler ×1
unification ×1