解析命令行参数

时间:2013-03-31 02:17:11

标签: swi-prolog

我对prolog非常困惑,它与我曾经使用的任何语言都有所不同(许多语言)我如何从中获取argv [0]:

current_prolog_flag(argv, Argv),
write(Argv).

现在,如果我尝试键入Argv [0]或Argv(0)或Argv< 0>它失败了..这让我没有任何线索和文档的帮助......似乎他们希望你已经是一个序幕专家:D

另一个问题是,如何将Argv [0]分配给变量,以便稍后使用“write”打印?

2 个答案:

答案 0 :(得分:4)

Prolog使用匹配。

?- current_prolog_flag(argv, [File | Rest]).
File = 'C:\\Program Files\\pl\\bin\\swipl-win.exe',
Rest = ['--win_app'].

这匹配一个头部和尾部的列表:

[Head | Tail]

Head是第一个元素,Tail是列表的其余部分。

要获取最后一个元素,请使用:

?- current_prolog_flag(argv, Argv), append(_, [Last], Argv).
Argv = ['C:\\Program Files\\pl\\bin\\swipl-win.exe', '--win_app'],
Last = '--win_app'

获取有关附加功能的帮助:

apropos(append).

答案 1 :(得分:2)

您可以使用nth0和nth1(与nth0相同,但从1开始计算元素而不是0)谓词:

current_prolog_flag(argv, Argv),
nth0(0, Argv, Argument0), % get first argument
nth0(1, Argv, Argument1), % get second argument
write(Argument0).

通常使用nth0(Index,List,Element)如下:

% get element by index
nth0(1, [a, b, c, d], E) % E = b

% get index by element
nth0(I, [a, b, c, d], b) % I = 1

% enumerate elements with their corresponding indexes
List = [a, b, c, d],
forall(nth0(I, List, E), format('List[~w]=~w~n', [I, E])).
% example above prints    
List[0]=a
List[1]=b
List[2]=c
List[3]=d